用户工具

站点工具


编程积累:cplusplus:struct的sizeof问题

对struct类型执行sizeof操作的时候,存在元素边界对齐问题。

具体的计算方式如下:

  1. 按成员声明的顺序,将各个成员的size相加。
  2. 考虑第n个元素的时候,如果这个元素的size为r,那么要先把之前相加的结果变为r的倍数,然后再把r加到结果上面。
  3. 最后相加得出结果,如果这个struct中最大的元素的size为m,那么结果的size必定为m的倍数,如果不是,那么应该把结果往上加,直到m的倍数为止。

下面是一道面试题:

#pragma pack(8)
 
struct example1
{
    short a;
    long b;
};
 
struct example2
{
    char c;
    example1 struct1;
    short e;
};
 
#pragma pack()
 
int main()
{
    example2 struct2;
    cout << sizeof(example1) << endl;
    cout << sizeof(example2) << endl;
    cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
       << endl;
    system("pause");
    return 0;
}

结果为8、16、4。

struct的对齐是为了提高运算效率,缺省情况下,编译器为struct的每一个元素按自然对界条件分配空间。

自然对界就是按默认的方式对齐,指按struct中size最大的元素对齐。

指定对界:

#pragma pack(n) #pragma pack()

如果n大于struct中size最大的元素的size,那么语句将不起作用。

评论

请输入您的评论. 可以使用维基语法:
 
编程积累/cplusplus/struct的sizeof问题.txt · 最后更改: 2018/09/17 10:27 由 eric