我在Windows,x64模式下。在Visual Studio上使用MSVC进行编译。当我执行此操作时,new
运算符似乎无法正常工作:
char* buf = new char[1LLU << 32];
但是,如果我传入一个变量而不是直接输入大小,则它可以正常工作:
uint64_t sz = 1LLU << 32;
char* buf = new char[sz];
[查看汇编代码,编译器忽略了我提供的大小,只是忽略了xor ecx, ecx
,我相信只是将0传递给new
运算符。
这真令人困惑!我不知道标准中是否指定了一些规则?谢谢!
ps.s。 char* buf = new char[1LLU << 31];
正常工作。所以我认为这与我使用的整数大小有关。但是在文档上,new
接受size_t
作为参数,在x64上应为uint64_t
。
在您的声明中添加const
:
const uint64_t sz = 1LLU << 32;
您将得到相同的错误:
这是数组分配的“安全” MSVC阈值,但是由于您提供了非常量大小变量,因此编译器不会在编译时解析它。