2013-07-22

なぜ NULLが0でなければならないか

if( ptr != NULL ) つまり if (ptr) に最適化される命令のアセンブラ展開は

 

test eax,eax;

je label;

に展開されるが

if( ptr != 1 ) つまり 0以外への比較アセンブラ展開は

 

cmp eax,1;

je label;

に展開される。test 命令は実質 AND命令 論理積 であるが CMP命令は実質比較演算子

今は どちらも 1サイクル未満の命令なので どうでもいいことではあるが 当たり前だが CMPよりTEST命令のほうが 軽いので 

CPUへの負荷をきにして、歴史的経緯で 0 が採用されている。

 

また、NULLは初期値になることが多く 0 にしておいたほうがメモリ的にもお得。

 

対して、これらの歴史的経緯過去プログラム無視して、NULLを0以外にする明示的かつ合理的な理由は存在しない。

  • さらに言えば if( ptr != NULL )  は 本来 cmp eax,0に展開されるべきだが(最適化を無視すれば) if( ptr ) は 正しく test eax,eax を意味している。 つまり、 意味論的には、 if( ptr != NULL ) ...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん