2013-08-10 13 views
6

はいの場合:http://msdn.microsoft.com/en-us/library/83ythb65.aspx しかし、それは私には分かりません。まず、__declspec(align(#))は、それで宣言された(構造体内の)すべてのオブジェクトを整列オフセットで開始します。その部分は明らかです。アライメントは、オブジェクトが入っている構造体によっても「継承」されますが、オブジェクトのサイズは変更されません。`__declspec(align(#))`はどのように機能しますか?

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

リターン32:正確には、なぜこのコードでsizeof()していますか?

答えて

12

オブジェクトのサイズは、配列内のオフセットを計算するために使用されます。ポインタを使用する場合、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になります。

コンパイラは構造体の名前付きメンバの後ろにunamedパディングメンバを追加して構造体をその整列サイズに塗りつぶすという方法です。

それはこのように動作しなかった場合は、のようなもの:コンパイラが内部aPtrに追加するsizeof(aPtr)12を掛けますので、

aType *aPtr = new aType[15]; 

aPtr[12].a = 42; 

は、正しく動作しません。

+0

実際に**構造体/オブジェクトのサイズを**変更しますか? – NPS

+2

はい、 'struct'は32バイトになりました。 2つの整数の8バイトと24のそれらのバイトは、例えば配列の最初のaTypeオブジェクトと2番目のaTypeオブジェクトとの間の空白スペースを埋めるための "filler"です。 –

+0

それでは、なぜここにあるのですか? 'struct aType {int a; int b;}; typedef __declspec(align(32))struct aType bType; 'サイズ変更ではなくアライメントだけが変更されます([MSDN](http://msdn.microsoft.com/pl-pl/library/83ythb65.aspx) __declspec(align(#)) ")で新しい型を定義する? – NPS

0

ドキュメンテーションの作成が不十分であるか、外国語としての英語のコマンドがそれと同程度ではありません。

// 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()、NOTその中のメンバーのそれぞれに影響を与えます。各プロパティを揃えるには、メンバーレベルで配置を指定する必要があります。

私も当初はstruct-level __declspec(align())がそれに影響を及ぼしていると考えていましたが、そうではありません。ですから、メンバーごとの整列が必要な場合は、具体的にする必要があります。

関連する問題