我以为我了解 C/C++ 如何处理结构成员对齐。但是对于 Visual Studio 2008 和 2010 中的特定安排,我得到了奇怪的结果。
具体来说,我发现由 char、short 和 char 组成的结构被编译为 6 字节结构,即使启用了 4 或 8 字节打包也是如此。我不知道为什么会这样。我可以理解一个 4 字节的结构。我也许可以理解一个 8 字节的结构。但是我认为当启用 4 字节打包时,6 字节结构是不可能的。
演示该问题的程序是:
#include <iostream>
using namespace std;
#pragma pack (4)
struct Alignment
{
char c1;
short s;
char c2;
};
#define REPORT_VAR_POSITION( structName, varName ) cout << "Member '" << #varName << "' sits at byte # " << offsetof( structName, varName ) << "." << endl;
int main(int argc, char* argv[])
{
cout << "Sizeof struct Alignment is " << sizeof( Alignment ) << " bytes." << endl;
REPORT_VAR_POSITION( Alignment, c1 );
REPORT_VAR_POSITION( Alignment, s );
REPORT_VAR_POSITION( Alignment, c2 );
system( "pause" );
return 0;
}
输出是:
Sizeof struct Alignment is 6 bytes.
Member 'c1' sits at byte # 0.
Member 's' sits at byte # 2.
Member 'c2' sits at byte # 4.
Press any key to continue . . .
谁能解释为什么 VC 用一个额外的字节填充每个字符?