2011-12-20 15 views
6

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

+0

Estoy usando el compilador de 64 bits, por cierto, y dumpbin/headers muestra '8664 machine (x64)' y 'Application puede manejar direcciones grandes (> 2GB). –

+0

¿'buffer' parece un puntero razonable después de la asignación? ¿En qué 'i' se bloquea? – sth

+0

después de asignar el vector, ¿puede imprimir 'v.size()' para confirmar que no se truncaron variables en el camino? –

Respuesta

1

he intentado compilar el código dado con VS2010 Pro (versión de 64 bits), y el compilador produce una gran C2148 error para la new llamada:

error C2148: total size of array must not exceed 0x7fffffff bytes 

he recopilado desde el comando línea después de ejecutar vcvarsx86_amd64.bat. Parece que el limit given here es quizás de alguna manera entrar en juego. Cambiar el new al [BUF_SIZE-1] le permitió compilar y ejecutar (aunque aún es más grande que el número 0x7fffffff mencionado en esos enlaces).

+0

Creo que no estaba haciendo una compilación de 64 bits. Estoy compilando usando cl.exe desde el símbolo del sistema de 64 bits, pero también puedes crear una Plataforma de soluciones x64 desde el IDE. –

+0

@JamesMcNellis: De hecho. Estaba desconcertando sobre eso también. Parece tal vez como si tal vez hubiera un error en el compilador (pero cada vez que pienso eso, de alguna manera resulta ser algo que hice mal o interpreté incorrectamente). –

+0

Puede confirmar que su ejecutable es un ejecutable de 64 bits ejecutando dumpbin/headers desde un símbolo del sistema de Visual Studio y leyendo las primeras líneas. –

Cuestiones relacionadas