为什么我可以在Windows上使用大缓冲区作为向量但不能使用新缓冲区?

Jim*_*ker 6 c++ arrays 64-bit visual-c++

我正在使用64位Windows 7 Pro和Visual Studio 2010 Pro.

我正在尝试分配和使用大于4 GB的缓冲区(用于高数据速率数据捕获).

将缓冲区分配和写入字节向量可以正常工作.将缓冲区分配为字节数组工作正常,但写入该数组会很快崩溃.(打印的最后一条消息是"缓冲区已分配".)

注释掉矢量部分并不能解决问题.

以下是我的测试程序:

#include <iostream>
#include <vector>
#include <BaseTsd.h>

using namespace std;

int main() {
  const ULONG64 BUF_SIZE = 4 * 1024ULL * 1024ULL * 1024ULL;

  {
    vector<unsigned __int8> v(BUF_SIZE);
    cout << "vector allocated" << endl;
    for (ULONG64 i = 0; i < BUF_SIZE; ++i) {
      v[i] = 0xff;
    }
    cout << "vector written" << endl;
  }

  {
    unsigned __int8* buffer = new unsigned __int8[BUF_SIZE];
    cout << "buffer allocated" << endl;
    for (ULONG64 i = 0; i < BUF_SIZE; ++i) {
      buffer[i] = 0xff;
    }
    cout << "buffer written" << endl;
    delete[] buffer;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:我相信这是一个编译器错误.请看:http: //connect.microsoft.com/VisualStudio/feedback/details/553756/invalid-check-for-maximum-array-size-in-x64-compiler-c2148

Mar*_*ins 1

我刚刚尝试使用 VS2010 Pro(64 位版本)编译给定的代码,编译器为调用生成了C2148 错误new:

error C2148: total size of array must not exceed 0x7fffffff bytes
Run Code Online (Sandbox Code Playgroud)

我运行后从命令行编译它vcvarsx86_amd64.bat。看来这里给出的限制可能会以某种方式发挥作用。更改new为[BUF_SIZE-1]允许其编译和运行(尽管它仍然大于这些链接中讨论的 0x7fffffff 数字)。