>>145
00007FF66238310D mov ecx,10000000h
00007FF662383112 call operator new[] (07FF6623811E5h)

147
char* data_ = (char*)operator new[](0x100000000);
00007FF7CA02310D mov rcx,100000000h
00007FF7CA023117 call operator new[] (07FF7CA0211E5h)

よく見ると、これら二つで、call文の呼び出し先のアドレスの下位16BIT
は、共に11E5 になっていて、上位アドレスは変わっているが本当は
同じ関数を呼び出しているようだ。リンクするとアドレスは上位も下位も変わることがあるが、
上位アドレスだけ変わる現象としてはセキュリティー対策のためと聞いている。
それで、mov 文が ecx と rcx の違いがあるが、実は mov ecx,imm 命令は
上位32BITが0拡張されるので mov ecx,10000000h は、
実際には、mov rcx,0 と同じなので、145の方は、動作的には
mov rcx,0
call operator new[] // 64BIT 版の new 演算子
となっていて、145もちゃんと 64BIT版の new 演算子が呼び出されているようだ。
問題は、new char[x]のxに定数が有ったときに下位32BITだけに切り捨てられてしまう
コンパイラの動作にあるようだ。