ときどきの雑記帖 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などから使用できます。

スポンサード リンク

この記事のカテゴリ

  • ⇒ x64版WindowsとNULLマクロ
  • ⇒ x64版WindowsとNULLマクロ