в x64, я могу получить не более 1.9G памяти malloc(), но моя физическая память - 8G, почему это происходит?Сколько памяти мы можем получить через malloc() в x64?
ответ
Это, скорее всего, происходит потому, что вы используете 32-разрядный компилятор, 32-разрядную ОС или (возможно) и то, и другое.
Я упростил свой код совсем немного, к этому:
#include <iostream>
#include <stdlib.h>
int main() {
void *block = malloc(1024LL * 1024LL * 1024LL * 6);
if (block)
std::cout << "Allocated 6 Gig block\n";
else
std::cout << "Unable to allocate 6 Gig block.\n";
return 0;
}
Если я компилирую это с 32-битным компилятором, он выходит из строя (печатает если я «Невозможен выделяемой 6 Gig блока.» скомпилируйте его с помощью 64-битного компилятора, он преуспеет (распечатывает «Allocated 6 Gig block»). У меня нет 32-битной ОС, способной ее протестировать, но я уверен, что с 32-разрядной ОС , он также потерпит неудачу (32-разрядный исполняемый файл будет действовать примерно так же, как в 64-битной ОС, а 64-разрядный исполняемый файл вообще не будет работать на 32-разрядной ОС).
Specs: 32-bit compilers tested: gcc 4.8.1 (MinGW), Microsoft VC++ 17.
64-bit compiler: VC++ 17.
OS: Windows 8 x64.
(Разумеется, битность компилятора не имеет значения, это битвость выхода компилятора, но +1, потому что это педантично ...) –
@Billy Я бы сказал, что это вопрос интерпретации, а не педантизма. Когда я читаю «32-битный компилятор», я думаю «компилятор, который компилирует 32-битный код». Продавцы компилятора в моем опыте используют его так же. –
@ Коди: Да ... это то, что я могу задуматься на MSVC++ land, которое поставляется с 32-битными и 64-битными компиляторами, нацеленными на 64-битные. –
Это 32-битный или 64-битный процесс? Кроме того, физическая память! = Виртуальная память – Patashu
Проверьте свои настройки ссылок - используете ли вы 64-битный компилятор, компоновщик и т. Д.? – James
Какая операционная система? ОС может налагать ограничения на размер каждого процесса. Чтобы узнать, компилируете ли вы в 32-битном или 64-битном режиме, проверьте размер указателя: 'printf ("% d \ n ", (int) sizeof (void *));' –