Почему я могу использовать большой буфер как вектор, а не новый в Windows? - PullRequest
6 голосов
/ 20 декабря 2011

Я использую 64-разрядную версию Windows 7 Pro и Visual Studio 2010 Pro.

Я пытаюсь выделить и использовать буфер размером более 4 ГБ (для захвата данных с высокой скоростью передачи данных).

Выделение и запись буфера как вектора байтов работает нормально. Выделение буфера в виде массива байтов работает нормально, но запись в этот массив происходит быстро. (Последнее напечатанное сообщение: «выделен буфер».)

Комментирование векторного раздела не решает проблему.

Вот моя тестовая программа:

#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

1 Ответ

1 голос
/ 20 декабря 2011

Я только что попытался скомпилировать данный код с помощью VS2010 Pro (64-разрядная версия), и компилятор выдал ошибку C2148 для вызова new:

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

Я скомпилировал его из командной строки после запуска vcvarsx86_amd64.bat. Кажется, что ограничение , данное здесь , возможно, каким-то образом вступает в игру. Изменение new на [BUF_SIZE-1] позволило ему скомпилировать и запустить (хотя это все же больше, чем число 0x7fffffff, обсуждаемое в этих ссылках).

...