我正在使用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;
}
更新:我认为这是一个编译错误。看这里: http://connect.microsoft.com/VisualStudio/feedback/details/553756/invalid-check-for-maximum-array-size-in-x64-compiler-c2148
答案 0 :(得分:1)
我刚尝试使用VS2010 Pro(64位版本)编译给定代码,编译器为new
调用生成C2148 error:
error C2148: total size of array must not exceed 0x7fffffff bytes
我在运行vcvarsx86_amd64.bat
后从命令行编译了它。似乎limit given here可能会以某种方式发挥作用。将new
更改为[BUF_SIZE-1]
允许它编译并运行(尽管它仍然大于这些链接中讨论的0x7fffffff数。)