アライメントの調整を楽にする
構造体を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