Параметр компилятора Win32 и выделение памяти - PullRequest
1 голос
/ 14 июля 2020

Я попытался скомпилировать следующий код:

extern "C" {
    #include "netcdf.h"
}

int main() {
    const int Ntime = 336;
    const int Nlon = 1442;
    const int Nlat = 1021;
    double* dhsum_vals = new double[Ntime * Nlat * Nlon];
}

При компиляции с 32-битной версией я получаю ошибку C2148 «общий размер массива не должен превышать 0x7fffffff байт». Думаю, проблема здесь в том, что 32-х программа не позволяет использовать здесь столько памяти, сколько я хочу. Если я компилирую с 64-битной версией, я получаю сообщение об ошибке, что netcdf не может быть найден, поскольку я скачал 32-битную версию. Итак, моим решением будет загрузить 64-битную версию библиотеки netcdf. Однако, когда я брал 32-битную версию, я хотел сделать ее более совместимой. Есть ли другое решение моей проблемы, кроме 64-битной версии netcdf?

1 Ответ

3 голосов
/ 14 июля 2020

В Microsoft Windows виртуальное адресное пространство 32-разрядного процесса ограничено 2 ^ 32 байтами, что составляет около 4 ГБ. Однако более высокие 2 ГБ зарезервированы системой, так что фактически у вас есть только около 2 ГБ адресного пространства.

Кроме того, это адресное пространство фрагментировано, поэтому вы не сможете выделить 2 ГБ в один последовательный кусок. Вы можете получить до 2 ГБ, если попытаетесь выделить несколько меньших объемов памяти.

Хотя 32-разрядный процесс может использовать более 4 ГБ памяти с помощью Address Windowing Extensions API , это требует особых привилегий безопасности и делает ваш код излишне сложным, поскольку вы не можете одновременно отображать всю память, которую вы используете, в ваше виртуальное адресное пространство. Поэтому я настоятельно рекомендую вам вместо этого скомпилировать 64-битную версию вашего приложения, когда вы обрабатываете большие объемы памяти.

Я не думаю, что использование 64-битной версии сделает вашу программу менее совместимой , так как почти все современное оборудование и операционные системы поддерживают его.

...