C /C++が構造体メンバーの配置をどのように処理するかを理解したと思いました。しかし、VisualStudio2008および2010の特定の配置で奇妙な結果が得られています。
具体的には、char、short、およびcharで構成される構造体は、4バイトまたは8バイトのパッキングが有効になっている場合でも、6バイトの構造体にコンパイルされることがわかりました。なぜそうなるのか途方に暮れています。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がこれらの各文字に追加のバイトをパディングしている理由を誰かが説明できますか?