さらに言えば
if( ptr != NULL ) は 本来 cmp eax,0に展開されるべきだが(最適化を無視すれば)
if( ptr ) は 正しく test eax,eax を意味している。
つまり、 意味論的には、 if( ptr != NULL ) と if( ptr ) は別物で アセンブラ的には if( ptr ) って書けよと。
もっと言えば、直近でptrを演算していれば 最良の最適化ではtestすら抜けるかもしれない。
というのが本来 アセンブラをより簡易に書くC言語系列の宿命のはずなんだが、なんか、アセンブラを無視してC++言語が改造されていくなぁと
ちょっと思った。
なぜ NULLが0でなければならないか? if( ptr != NULL ) つまり if (ptr) に最適化される命令のアセンブラ展開は test eax,eax; je label; に展開されるが if( ptr != 1 ) つまり 0以外への...
さらに言えば if( ptr != NULL ) は 本来 cmp eax,0に展開されるべきだが(最適化を無視すれば) if( ptr ) は 正しく test eax,eax を意味している。 つまり、 意味論的には、 if( ptr != NULL ) ...