アライメントの調整を楽にする

構造体をVBA(Excel)からC++に投げつける際には、データのメモリへの詰め込まれ方、アライメント(VC++デフォルト8バイト・VBA4バイト)に注意せんといかんわけです。
これを成し遂げるために今までは【プロジェクトのプロパティ】→【C/C++】→【コード生成】→【構造体メンバのアライメント】を「4バイト(/Zp4)」にしていたのですが、pragma packでいけるってのがわかったのでメモん。

下のコードではX1・X2構造体がpragma packではさまれているか否かのみが異なる。
これでX1はデフォルトの8バイト毎、X2は指定した4バイト毎にアライメントされる。

#include <iostream>
using namespace std;
struct X1
{
    int x;
    double y;
};
#pragma pack(push,4)
struct X2
{
    int x;
    double y;
};
#pragma pack(pop)
int main()
{
    std::cout << sizeof(X1) << std::endl;
    std::cout << sizeof(X2) << std::endl;
    return 0;
}

実行結果を見てみると、X1は8バイトなので、int(4バイト)が埋められた後、4バイトの空白があり、その後doubleの8バイトが入るような形になっている(合計12バイト=4+4+8)一方、
X2は4バイトなので、int(4バイト)が埋められた後、空白なしにdoubleの8バイトが入るような形になっている(合計12バイト=4+8)。

16
12