结构体大小

结构体计算大小存在内存对齐的关系,如定义一个S结构体。

struct S
{
    char a;
    short b;
    char c;

    int d;
};

 

a占一个字节,而b占2个字节,因此b需要对齐到2的整数倍处。1地址处的空间被浪费掉,同理int占4个字节,要对齐到4的整数倍处。而最后的大小必须是最大对齐数的整数倍。这里S结构体最大对齐数是4(int),所以最后大小是占12个字节;

当一个结构体里面嵌套了个其他结构体

struct A
{
    int e;
    double f;
};
struct S
{
    char a;
    short b;
    char c;
    int d;
    struct A;
};

a-b的总大小已经经过计算是12,而后面A对齐方式:对齐结构体A中最大对齐数的倍数;

此时结构体A中最大对齐数是8(double),那么就直接对齐到16 ,中间的地址浪费掉。

再按照内置变量对齐的规则计算得S结构体大小为32。

<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字节
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值