Доступ к памяти больше, чем размер UINT_MAX * 4 в C? - PullRequest
0 голосов
/ 16 июня 2009

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

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

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

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

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

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

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

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

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

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

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

или

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

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

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

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

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

Спасибо.

-AD.

Ответы [ 6 ]

7 голосов
/ 16 июня 2009
  1. Вам нужна 64-битная ОС
  2. malloc получает size_t как параметр, 64-битный на 64-битных платформах
  3. И самое важное: Вы, вероятно, должны подумать: нужно ли выделять больше 4 ГБ памяти?
5 голосов
/ 16 июня 2009

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

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

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

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

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

4 голосов
/ 16 июня 2009

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

1 голос
/ 16 июня 2009

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

1 голос
/ 16 июня 2009

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

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

0 голосов
/ 14 июля 2009

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

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

Читайте о некоторых опциях,

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

...