Доступ к памяти больше размера UINT_MAX * 4 в C?

Предположим, у меня есть массив размером 78719476736 байт. Имейте в виду, что этот массив динамически выделяется с помощью malloc в моем коде C. Предположим, что malloc возвращает действительный указатель после выделения такого большого объема памяти. Размер этого массива больше, чем UINT_MAX(4294967295) , т.е. максимальный предел беззнакового целого числа (32 бита)

Предположим, мой код выглядит как-то ниже, например.

int *buf;
buf = (int*)malloc(78719476736);

Здесь 78719476736 больше, чем 4 * UINT_MAX.

Теперь, если мне нужно обратиться ко всем элементам buf, то, поскольку buf имеет тип int*, он будет 32-битным, поэтому он не сможет адресовать все элементы памяти, которые я выделил с помощью malloc (78719476736 байт).

Мой вопрос заключается в том, не следует ли изменить приведенный выше код, чтобы сделать buf такой длинной (64-битная переменная), поскольку только длинная длинная переменная сможет адресовать большую память, которую я выделил.

Измененный код, например.

unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);

На самом деле я думаю, что переменная buf больше не должна быть указателем, поскольку любой указатель будет иметь ширину 32 бита и, следовательно, он не сможет получить доступ к 78719476736 байтам.

Таким образом, это должен быть простой unsigned long long int, и мне придется привести значение указателя возврата malloc к unsigned long long int, как показано в измененном коде выше, и использовать buf для доступа ко всем выделенным элементам.

Я прав в своих предположениях выше?

or

Я что-то путаю/упускаю?

РЕДАКТИРОВАТЬ: Если это поможет,

Я работаю над рабочим столом с WinXP на Intel Core 2 Duo (64-разрядный процессор). Таким образом, с точки зрения процессора не должно быть проблем с доступом к адресному пространству более 4 ГБ. Какие все остальные компоненты должны быть включены для поддержки 64 бит, т.е.

а.) Как включить поддержку компилятором 64-разрядных систем при компиляции (я использую Visual Studio 2005 Professional edition)

б.) Поддержка ОС для 64-битной версии — я использую Windows XP Professional.

Спасибо.

-AD.


person goldenmean    schedule 16.06.2009    source источник
comment
Пожалуйста, скажи мне, какого черта ты пишешь, чтобы я никогда непреднамеренно не заставлял тебя использовать malloc 73 ГБ на моем сервере...   -  person Eric    schedule 16.06.2009


Ответы (6)


  1. Вам нужна 64-битная ОС
  2. malloc получает size_t в качестве параметра, который является 64-битным на 64-битных платформах.
  3. И самое главное: Вы, наверное, должны подумать: нужно ли мне выделять больше 4G памяти?
person Artyom    schedule 16.06.2009

Я думаю, вы глубоко запутались в том, что такое указатель. По крайней мере, в обычных системах размер указателя (количество различных значений, то есть количество различных адресов) не зависит от типа!

int *a;
short *b;
double *c;

a, b и c являются указателями на разные типы, но все они имеют одинаковый размер (например, 4 байта в 32-битной системе). Именно в этом смысл 64-битной системы по сравнению с 32-битной: иметь возможность адресовать более 2 ** 32 местоположений из указателя.

Кроме того, 32-битный ЦП также не может аппаратно адресовать более 4 Гб [1], и соответствующее виртуальное адресное пространство также обычно ограничено 32-битами. Так что выделение 8 Гб памяти в любом случае вряд ли сработает.

[1] это не совсем так - например, ЦП Intel имеет расширения, так что 32-битный ЦП может использовать «расширенные» адреса.

person David Cournapeau    schedule 16.06.2009

int* — это тип указателя. Если вы работаете в системе, которая может выделить 78719476736 байт, она, вероятно, имеет как минимум 64-битные адреса, то есть sizeof(int*) >= 8. Размер указателя не имеет ничего общего с тем, что такое sizeof(int).

person laalto    schedule 16.06.2009

Для адресации более 4 ГБ памяти вам нужен какой-то механизм выбора этой памяти. Поэтому вам нужно скомпилировать ваше приложение как 64-битное, и тогда все ваши указатели будут иметь ширину 64 бита.

Единственным другим способом получить доступ к более чем 4 ГБ памяти было бы использование дополнительного механизма выбора адреса/памяти, очень похожего на то, что вы использовали с сегментом и смещением беспорядка в дни реального режима DOS. Это, конечно, зависит от архитектуры вашего процессора.

person Daemin    schedule 16.06.2009

Если вы запускаете свое программное обеспечение на 64-битной ОС и используете 64-битные настройки компилятора, все ваши указатели будут 64-битными. Нет необходимости в специальной декларации.

person joelr    schedule 16.06.2009

Это невозможно, ваш компилятор и ОС не поддерживают это, и точка.

Для Windows вы можете ознакомиться с документацией по _HEAP_MAXREQ.

Почитайте о некоторых вариантах,

большие 64-битные malloc

person RandomNickName42    schedule 14.07.2009