このコードでは16と出力されます。
コード: 全て選択
#strict
#prompt
Type Align(8) S1
x As DWord
y As DWord
End Type
Print SizeOf (S1)
しかしそれと同等と私が思った次のVC++のコードでは8が出力されます。
コード: 全て選択
#include <iostream>
#include <windows.h>
__declspec(align(8)) struct S1
{
DWORD x;
DWORD y;
};
int main()
{
std::cout << sizeof (S1) << std::endl;
}
色々と試してみると,次のコードでは16と出力されました。
コード: 全て選択
#include <iostream>
#include <windows.h>
struct S1
{
__declspec(align(8)) DWORD x;
__declspec(align(8)) DWORD y;
};
int main()
{
std::cout << sizeof (S1) << std::endl;
}
つまりアラインメントの対象が構造体全体であるか,個々のメンバであるかの違いのようです。
私はABのTypeに指定するAlignは構造体全体に対するアラインメントの指定であるべきだと思います。
つまり最初のABのコードは前者のVC++のコードに対応するようにするということです。
そもそもWinAPIで使われる構造体の中には8バイトアラインメントが指定されているものがあります。
そのような構造体をABに持ってくるとき,試しにType Align(8)としてみたことからこのことに気づきました。
VC++ではalign(8)と指定されているのに,ABでは付けるとエラーになるので省くということは,
どうも違和感を感じさせます。それが前者の意味にしてほしいと言う理由ですね。