关于结构体的大小

如何计算结构体的大小呢?

  

     常见的类型大小:比如对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4 ,size of(short)=2, sizeof(float)=4;sizeof(double)=8

 

偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小.

 

但要注意两个原则:

       一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)

       二、结构体大小必须是所有成员大小的整数倍。

       三, 如果结构体中的成员又是另外一种结构体类型时,只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍.

 

下面举几个例子来说明:

 

1.        

struct stu1
         {
               int i;
               char c;
               int j;
         };

sizeof (stu1)=12;

 

2.

struct stu2
         {
               int k;
               short t;
         };

sizeof(stu2)=8;

3.

struct stu3
         {
               char c1;
               int i;
               char c2;
         }

sizeof(stu3) =12

struct stu4
         {
               char c1;
               char c2;
               int i;
         }

sizeof(stu4)=8;

struct stu5
               {
               short i;
               struct
               {
                  char c;
                  int j;
               } ss;
               int k;
         }

sizeof(stu5)=16; 

<think>嗯,用户问的是如何测量结构体大小,也就是C++中结构体的sizeof结果。首先,我得回忆一下结构体内存对齐的规则。结构体大小并不总是等于各成员大小之和,因为编译器会根据对齐规则进行填充。比如,一个结构体如果有char和int两个成员,char通常占1字节,int占4字节,但由于对齐,编译器可能会在char后面填充3字节,使结构体大小为8字节。 接下来,我需要考虑不同的对齐方式对结构体大小的影响。比如#pragma pack指令可以改变默认的对齐系数,这时候结构体的布局可能不同。例如,如果使用#pragma pack(1),结构体成员之间不会有填充,总大小就是各成员之和。 然后,应该举几个例子来说明不同情况下的结构体大小。比如一个包含两个int和一个char的结构体,默认对齐下可能是12字节,而使用pack(1)的话则是9字节。此外,还要提到空结构体大小,不过在C++中空结构体大小是1字节,这是为了确保不同实例有唯一的地址。 最后,用户可能需要知道如何实际测量结构体大小,可以通过sizeof运算符,然后给出示例代码,展示不同情况下的输出结果。同时,解释为什么会有这样的结果,比如内存对齐的原因,以及如何通过调整对齐方式优化空间或访问速度。 在相关问题部分,应该围绕内存对齐、结构体与类的区别、pragma pack的作用、空结构体大小等方面提问,这样用户能进一步深入学习相关概念。</think><< 在C++中测量结构体大小需要使用sizeof运算符,结构体大小由成员变量、内存对齐规则和编译器实现共同决定。以下是测量结构体大小的关键要点及示例: 1. 基本测量方法: ```cpp struct Example { int a; // 4 bytes char b; // 1 byte double c; // 8 bytes }; cout << sizeof(Example); // 输出结果通常是16(取决于对齐设置) ``` 2. 内存对齐规则: - 结构体大小等于其最宽基本类型成员的整数倍 - 成员偏移量必须是其类型大小的整数倍 - 编译器可能插入填充字节(padding)满足对齐要求 3. 常见影响因素: - 成员顺序:不同排列顺序会产生不同大小 ```cpp struct BadOrder { char a; double b; char c; }; // 可能24字节 struct GoodOrder { double b; char a, c; }; // 可能16字节 ``` 4. 手动控制对齐: 使用#pragma pack改变默认对齐系数 ```cpp #pragma pack(push, 1) struct PackedStruct { int a; char b; double c; }; // 大小13字节 #pragma pack(pop) ``` 5. 空结构体特例: ```cpp struct Empty {}; // sizeof(Empty) == 1(C++标准要求) ``` 测量示例解释: 当结构体包含int(4B)、char(1B)、double(8B)时: - 默认对齐(8字节对齐): 4(int) + 1(char) + 3(padding) + 8(double) = 16字节 - 1字节对齐(#pragma pack(1)): 4 + 1 + 8 = 13字节
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值