Char、Short、およびChar(その順序で)で構成される構造体が、4バイトパッキングを有効にしてC ++でコンパイルしたときに、6バイトの構造体に到達するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/3638317

質問

C/C ++がStructメンバーのアライメントをどのように処理したかを理解したと思いました。しかし、Visual Studio 2008と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が追加のバイトでそれらの各チャーをパディングしている理由を誰かが説明できますか?

役に立ちましたか?

解決

から のMSDNドキュメント #pragma pack (どこ n 設定した値です):

メンバーのアライメントは、の倍数である境界上にあります n または、メンバーのサイズの複数のいずれか小さい方。

sizeof(short) 2バイトで、設定した4バイトの梱包値よりも小さいため、 short メンバーは2バイトの境界に合わせられます。

最後 char (c2)その後、余分なバイトがパッドで埋められているので Alignment オブジェクトは配列に配置されます short 要素は、2バイトの境界でまだ正しく整列されています。配列要素は隣接しており、それらの間にパディングがない可能性があるため、配列の適切なアライメントを確保するために、構造の端にパディングを追加する必要があります。

他のヒント

どうやら、あなたはそれを誤解しているようです。ビジュアルスタジオではできません 増加 structパッキング設定を使用して、あらゆるタイプの構造メンバーのアライメント要件。だけ可能です 下降 彼ら。

構造体が構成されている場合 char (1バイトの境界で整列)および short (2バイトの境界に合わせて)オブジェクト、4バイトと8バイトのパッキング設定を使用しても、構造のレイアウトやサイズにまったく影響しません。結果は、2バイトパッキングとまったく同じです。構造のサイズは6バイトです。

この場合に効果がある唯一のパッキング設定は、1バイトのパッキング設定です。 下降 のアライメント要件 short 2から1で、構造の4バイトサイズになります。

このコマンドオプション /ZP [n]を備えたVisual StudioのCコンパイラ。 n- バイテ境界、これがどこにありますか #pragma pack 指令が登場し、構造のメンバーはnの倍数の境界に合わせられます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top