使用新的C ++(Windows)分配大于2GB的单个对象

问题描述 投票:3回答:1

我在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

c++ windows visual-c++
1个回答
2
投票

在您的声明中添加const

const uint64_t sz = 1LLU << 32;

您将得到相同的错误:

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2148?redirectedfrom=MSDN&view=vs-2019

这是数组分配的“安全” MSVC阈值,但是由于您提供了非常量大小变量,因此编译器不会在编译时解析它。

© www.soinside.com 2019 - 2024. All rights reserved.