返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++结构体字节对齐和共用体大小
  • 169
分享到

C++结构体字节对齐和共用体大小

2024-04-02 19:04:59 169人浏览 八月长安
摘要

目录1、结构体内存对齐2、共用体的内存大小3、枚举的大小1、结构体内存对齐 结构体内存对齐在笔试和面试中经常被问到,所以做个总结 通过代码验证不同结构体的内存大小: #inclu

1、结构体内存对齐

结构体内存对齐在笔试和面试中经常被问到,所以做个总结

通过代码验证不同结构体的内存大小:


#include <stdio.h>
struct node1{
    char c1;
    int val1;
    char c2;
};
struct Node2{
    char c1;
    char c2;
    int val1;
};
struct Node3{
    char c1;
    char array[10];
};
struct Node4{
    char val1;
    int arrar[10];
};
int main(){
    printf("Node1 size = %d\n",sizeof(struct Node1));
    printf("Node2 size = %d\n",sizeof(struct Node2));
    printf("Node3 size = %d\n",sizeof(struct Node3));
    printf("Node4 size = %d\n",sizeof(struct Node4));

    return 0;
}

代码运行结果为:

通过上述代码运行结果可以发现Node1Node2定义了相同个数的变量,但是Node1的大小为12,Node2的大小为8,这是为什么呢?

这里首先明确两个概念:对齐数和最大对齐数,在结构体中对齐数就是每个成员类型的大小,如Node1中,对齐数为{1,4,1},在数组中,对齐数不是数组的大小,而是数组成员的大小,所以Node3的对齐数为{1,1},Node4的对齐数为{1,4}。最大对齐数是对齐数中的最大值(GCc编译器),最大对齐数可能受编译器的影响,通常编译器会有编译器对齐数,最大对齐数应该是编译器对齐数和结构体最大对齐数中较小值,如VS编译器对齐数为8,如果结构体的最大对齐数为16,那么计算结构体的最大对齐数应该为8。我的编译器为gcc,所以最大对齐数为结构体对齐数中的最大值。

知道最大对齐数后,就可以计算结构体的大小了,需要明确结构体的大小一定是最大对齐数的整数倍。那么Node1和Node2的成员类型是一样的,为什么Node1的大小为12字节,Node2的大小为8字节呢。这是因为结构体内存的连续性,在存储容量没有到最大对齐数的内存大小时,只要能够保存这个成员,结构体就会将该成员变量保存在一个最大对齐树的内存空间内。这样就避免了内存的过度浪费。

所以,上述各结构体的内存大小计算方式如下:

  • sizeof(Node1)= 1 + 3(浪费)+ 4 + 1 + 3(浪费) = 12
  • sizeof(Node2)= 1 + 1 + 2(浪费)+ 4 = 8
  • sizeof(Node3) = 1 + 1 * 10 = 11
  • sizeof(Node4) = 1 + 3(浪费)+ 4 * 10 = 44

那么结构体嵌套结构体的大小应该怎么计算呢?举以下例子:


#include <stdio.h>
struct Node1{
    char c1;
    int val1;
    char c2;
};
struct Node2{
    char c1;
    struct Node1 node;
    double val1;
};

int main(){
    printf("Node1 size = %d\n",sizeof(struct Node1));
    printf("Node2 size = %d\n",sizeof(struct Node2));
    return 0;
}

代码运行的结果为:

 可以明确,嵌套结构体的对齐数为所嵌套结构体的最大对齐数,所以Node1的对齐数为{1,4,1},Node2的对齐数为{1,4,8},最大对齐数分别为4和8,则代码里两个结构体的大小计算方式为:

  • sizeof(Node1)= 1 + 3(浪费)+ 4 + 1 + 3(浪费) = 12
  • sizeof(Node2)= 1 + 7(浪费)+ 12 + 4(浪费)+ 8 = 24

2、共用体的内存大小

对于以下共用体,读取它大小的代码如下:


#include <stdio.h>

uNIOn un1{
    int val;
    char c;
    double d;
};
union un2{
    int val;
    char array[5];
};

int main(){
    printf("un1 size = %d\n",sizeof(union un1));
    printf("un2 size = %d\n",sizeof(union un2));
    return 0;
}

代码运行结果为:

 共用体之所以叫共用体,就是因为它的成员变量共享内存,既然共享内存,那么共用体占用的内存空间一定要可以保存内存最大的成员类型,而un1的最大内存成员为double型,大小为8字节,所以un1的大小为8字节,那么un2的内存大小为什么不是5呢?这是因为要内存对齐,共用体也遵循内存对齐原则,un2的最大对齐数是4,因此un2的大小应该是4的整数倍数,所以,sizeof(un2)= 8.

3、枚举的大小

这里顺带提一下枚举的内存大小,代码验证如下:


#include <stdio.h>

enum Colour {
    RED,
    GREEN,
    BLUE
};
enum ProgramLanguage {
    python = 0xffffffffff,
    c = 8,
    java
};

int main()
{
    printf("Colour size = %d\n",sizeof(enum Colour));
    printf("ProgramLanguage size = %d\n",sizeof(enum ProgramLanguage));
    return 0;
}

代码运行结果为:

 可见枚举类型的大小是编译器根据定义的值自行给定的,实际使用中很少会超出4字节大小。

到此这篇关于c++结构体字节对齐和共用体大小的文章就介绍到这了,更多相关结构体字节对齐和共用体大小内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++结构体字节对齐和共用体大小

本文链接: https://lsjlt.com/news/157130.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++结构体字节对齐和共用体大小
    目录1、结构体内存对齐2、共用体的内存大小3、枚举的大小1、结构体内存对齐 结构体内存对齐在笔试和面试中经常被问到,所以做个总结 通过代码验证不同结构体的内存大小: #inclu...
    99+
    2024-04-02
  • C++结构体字节对齐和共用体大小的示例分析
    这篇文章主要介绍了C++结构体字节对齐和共用体大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、结构体内存对齐结构体内存对齐在笔试和面试中经常被问到,所以做个总...
    99+
    2023-06-25
  • C++结构体字节对齐示例
    目录示例代码不想让结构体自动对齐怎么办示例代码 #include <iostream> //输入输出流 using namespace std; #include ...
    99+
    2024-04-02
  • c语言结构体字节对齐的实现方法
    目录1.什么是字节对齐 2.为什么要有字节对齐 3.手动设置对齐 4.结构体比较方法 1.什么是字节对齐 在c语言的结构体里面一般会按照某种规则去进行字节对齐。 我们先看一段代码...
    99+
    2024-04-02
  • C语言结构体字节对齐的实现深入分析
    目录前言一、什么是字节对齐二、结构体字节对齐三、#pragma pack()的使用总结前言 本教程可能会用到一点汇编的知识,看不懂没关系,知道是那个意思就行了。使用的工具是vs201...
    99+
    2022-11-13
    C语言结构体字节对齐 C语言字节对齐
  • C语言详解结构体的内存对齐与大小计算
    目录结构体的内存对齐1、计算结构体的大小2、结构体的对齐规则3、为什么存在内存对齐?4、总结结构体的内存对齐 1、计算结构体的大小 struct S1 { char c1; // ...
    99+
    2024-04-02
  • C语言结构体的内存对齐与大小怎么计算
    这篇文章主要讲解了“C语言结构体的内存对齐与大小怎么计算”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言结构体的内存对齐与大小怎么计算”吧!结构体的内存对齐1、计算结构体的大小struc...
    99+
    2023-06-30
  • C语言中结构体struct怎么对齐
    这篇文章主要介绍“C语言中结构体struct怎么对齐”,在日常操作中,相信很多人在C语言中结构体struct怎么对齐问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中结构...
    99+
    2024-04-02
  • C语言结构体内存对齐详解
    目录实例一:分析:存储结构图如下实例二: 分析:存储结构如下实例三:  分析:存储结构如下 实例四:分析:存储结构图如下总结1、结构体内存对齐...
    99+
    2024-04-02
  • C语言中结构体和共用体如何使用
    本篇文章给大家分享的是有关C语言中结构体和共用体如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体 / struct结构体的定义声明一个结构体类型的一般形式为:str...
    99+
    2023-06-16
  • C语言中结构体和共用体实例教程
    目录一、实验目的二、实验内容三、实验记录3.1 候选人选票统计3.2 print函数3.3 链表总结一、实验目的 掌握结构体类型变量的定义和使用; 掌握结构体类型...
    99+
    2024-04-02
  • c# 如何使用结构体实现共用体
    目录理解 C 语言的共用体使用 C# 实现共用体共用体作为另一个共用体的成员在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的...
    99+
    2024-04-02
  • C语言中的结构体和共用体怎么使用
    这篇文章主要介绍了C语言中的结构体和共用体怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中的结构体和共用体怎么使用文章都会有所收获,下面我们一起来看看吧。结构体 / struct结构体的定义声明一...
    99+
    2023-06-16
  • 如何分析C/C++指针、函数、结构体和共用体
    如何分析C/C++指针、函数、结构体和共用体,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。指针变量与地址变量给谁用的变量是对某一块空间的抽象命名。变量名就是你抽象出来的某块...
    99+
    2023-06-28
  • 解析C/C++指针、函数、结构体、共用体
    目录指针变量与地址指针与指针变量占内存空间指针运算指针 变量与地址 变量给谁用的变量是对某一块空间的抽象命名。变量名就是你抽象出来的某块空间的别名。指针就是地址。指向某个地址。 指针...
    99+
    2024-04-02
  • C语言中结构体和共用体的示例分析
    这篇文章给大家分享的是有关C语言中结构体和共用体的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、实验目的掌握结构体类型变量的定义和使用;掌握结构体类型数组的概念和应用;掌握链表的概念,初步学会对链表进...
    99+
    2023-06-20
  • C++如何计算结构体与对象的大小
    如何计算结构体的大小 其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小相加就可以。但是,需要内存对齐那么究竟什么是内存对齐,又为什么要进行类型对齐呢? 结构...
    99+
    2024-04-02
  • C语言深入回顾讲解结构体对齐
    目录结构体对齐问题结构体嵌套结构体强制内存对齐拓展求结构体成员的偏移量结构体对齐问题 1、知识点的引入: struct data1 { char a;//1B int...
    99+
    2024-04-02
  • C语言中结构体怎么与内存对齐
    本篇内容介绍了“C语言中结构体怎么与内存对齐”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.结构体类型C语言中的2种类型:原生类型和自定义...
    99+
    2023-06-20
  • C语言中结构体、联合体的成员内存对齐情况
    前言 最近项目进行中,遇到一个小问题,在数据协议传输过程中,我为了方便解析,就定义了一个结构体,在数据的指针传入函数的时候,我用定义好的结构体进行强制转化,没想到一直解析失败,调试很...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作