Visual C中的结构对齐

Visual C提供编译器开关(/ Zp)和pack pragma来影响struct成员的对齐.但是,我似乎对它们如何运作有一些误解.

根据MSDN,对于给定的对齐值n,

The alignment of a member will be on a boundary that is either a
multiple of n or a multiple of the size of the member,whichever is
smaller.

假设包的值为8个字节(这是认值).在结构体中,我认为任何大小小于8字节的成员都将处于其自身大小的倍数的偏移量.大小为8字节或更大的任何成员将处于8字节的倍数的偏移量.

现在采取以下计划:

#include <tchar.h>

#pragma pack(8)

struct Foo {
    int i1;
    int i2;
    char c;
};

struct Bar {
    char c;
    Foo foo;
};

int _tmain(int argc,_TCHAR* argv[]) {
    int fooSize = sizeof(Foo); // yields 12
    Bar bar;
    int fooOffset = ((int) &bar.foo) - ((int) &bar); // yields 4

    return 0;
}

Foo结构的大小为12个字节.所以在Bar中,我希望Foo成员位于偏移8(8的倍数),而实际上它是偏移4.为什么呢?

此外,Foo实际上只有4 4 1 = 9字节的数据.编译器会在结尾处自动添加填充字节.但是,如果给定8字节的对齐值,它不应该填充到8的倍数而不是4吗?

任何澄清赞赏!

解决方法

你的摘录解释了这一点,“以较小者为准”.在32位平台上,int是4个字节. 4小于8.因此它具有4字节对齐.

pack pragma导致包装,而不是解压缩.除非有理由否则它不会填补.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...