9

はい、私これを読みました: http://msdn.microsoft.com/en-us/library/83ythb65.aspx しかし、それは私には明らかではありません。まず第一に、__declspec(align(#))宣言されたすべてのオブジェクト (構造体内) をアラインされたオフセットから開始します。その部分は明らかです。アラインメントは、オブジェクトが含まれる構造化によっても「継承」されます。しかし、オブジェクトのサイズは変更されませんね。正確には、なぜsizeof()このコードでは:

__declspec(align(32)) struct aType {int a; int b;};
sizeof(aType);

戻る32

4

2 に答える 2

13

オブジェクトのサイズは、配列内のオフセットを計算するために使用され、ポインターを使用する場合は、sizeof(x)常にアライメント値の倍数である必要があります。この場合は 1 x 32 です。しかし、 がある場合__declspec(align(32)) struct aType {int a[12]; };、sizeof(a) は 12 x 4 = 48 なので、サイズは 2 x 32 = 64 になります。4、8、または 16 に揃えるように変更すると、 48になります。

実際に動作する方法は、構造体の名前付きメンバーの後に名前のないパディングメンバーを追加して、構造体をその配置サイズに合わせることです。

このように機能しない場合は、次のようになります。

 aType *aPtr = new aType[15]; 

 aPtr[12].a = 42; 

12コンパイラは乗算して内部的sizeof(aPtr)に加算するため、正しく機能しません。aPtr

于 2013-08-10T20:12:40.877 に答える
6

ドキュメンテーションの書き方が悪いか、外国語としての私の英語力がそれに見合っていないかのどちらかです。

// make a nice 16 align macro
#ifndef ALIGN16
#define ALIGN16 __declspec(align(16))
#endif

// align the structure
struct ALIGN16 CB {
    ALIGN16 bool m1; // and
    ALIGN16 int m2; // align
    ALIGN16 int m3; // each
    ALIGN16 short m4; // element
};

// now it performs as expected
printf("sizeof(CB) %d\r\n", sizeof(CB));
CB vCb;
printf("CB: %p, %%%d\r\n", &vCb, (UINT_PTR)&vCb % 16);
printf("CB.m1: %p, %%%d\r\n", &vCb.m1, (UINT_PTR)&vCb.m1 % 16);
printf("CB.m2: %p, %%%d\r\n", &vCb.m2, (UINT_PTR)&vCb.m2 % 16);
printf("CB.m3: %p, %%%d\r\n", &vCb.m3, (UINT_PTR)&vCb.m3 % 16);
printf("CB.m4: %p, %%%d\r\n", &vCb.m4, (UINT_PTR)&vCb.m4 % 16);

__declspec(align(#))は構造体と のアラインメントにのみ影響し、その中sizeof()の各メンバーには影響しません。各プロパティを整列させたい場合は、メンバー レベルで整列を指定する必要があります。

また、最初は astruct-level __declspec(align())がそれに影響し、そのメンバーであると想定していましたが、そうではありません。したがって、メンバーごとの調整が必要な場合は、具体的にする必要があります。

于 2014-06-17T23:09:57.250 に答える