Estoy usando Windows 7 Pro de 64 bits y Visual Studio 2010 Pro.¿Por qué puedo usar un buffer grande como vector pero no como nuevo en Windows?
Estoy tratando de asignar y utilizar un búfer que es más grande que 4 GB (para la captura de datos de alta velocidad de datos).
La asignación y escritura del búfer como un vector de bytes funciona bien. La asignación del búfer como una matriz de bytes funciona bien, pero la escritura en esa matriz falla rápidamente. (El último mensaje impreso es "búfer asignado".)
Comentando la sección del vector no soluciona el problema.
La siguiente es mi programa de pruebas:
#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;
}
UPDATE: Creo que esto es un error del compilador. Ver aquí: http://connect.microsoft.com/VisualStudio/feedback/details/553756/invalid-check-for-maximum-array-size-in-x64-compiler-c2148
Estoy usando el compilador de 64 bits, por cierto, y dumpbin/headers muestra '8664 machine (x64)' y 'Application puede manejar direcciones grandes (> 2GB). –
¿'buffer' parece un puntero razonable después de la asignación? ¿En qué 'i' se bloquea? – sth
después de asignar el vector, ¿puede imprimir 'v.size()' para confirmar que no se truncaron variables en el camino? –