ときどきの雑記帖 2012 2012年9月(上旬)より、リリカル☆Lisp開発日記 » Blog Archive » 恐怖! 64bitと0と可変長引数の組み合わせに関連しての話です。64ビットWindowsかつVisual C++だとNULLはどうなっているのか気になって調べてみました。
Windows(正確にはVisual C++ 2012)で試してみたら、x86-64でもsizeof (NULL)は4でした。
ただ、Windowsのx64呼び出し規約では8バイト未満の整数型は符号拡張することになっているようで、件のコードはうまく動くのではないかと思います。参考: he history of calling conventions, part 5: amd64 – The Old New Thing
ごくごく簡単にprintf(“%p\n”, NULL);やint x = 0; printf(“%p\n”, x);で試してみましたが、たしかに符号拡張するコード(xor edx, edxやmov edx, DWORD PTR x$[rsp])が生成されていました。この程度、試したと言うにはおこがましい感じもしますがご容赦を。
一応、Visual C++ 2012のstddef.hを見てみました。そのまま0と定義されています。
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif |
もちろん現在のC++なら、NULLよりも0よりもnullptrキーワードがおすすめです。GCC 4.6、Clang 3.0、Visual C++ 2010などから使用できます。
スポンサード リンク |