Первая ошибка: size_t
не обязательно unsigned int
, таким образом, его максимальное значение может отличаться от одного из unsigned int
(UINT_MAX
); кроме того, в C++ для получения информации о границах типа вы должны использовать std::numeric_limits
.
#include <limits>
size_t s=std::numeric_limits<size_t>::max();
Вторая ошибка: вы никогда не получите массив такой большой; поскольку size_t
требуется, чтобы иметь возможность выражать наибольший размер любого объекта, он должен, вероятно, быть достаточно большим, чтобы выразить объект большой, как и все адресное пространство, доступное для приложения, но при попытке выделить такой большой объект потребуется выделить целое адресное пространство к нему, что является недопустимым; кроме того, вы запрашиваете массив из int
s, что означает, что он будет UINT_MAX*sizeof(int)
байтов большой, что, вероятно, будет примерно в 4 раза больше всего адресного пространства - явно бред - и, кстати, sizeof(arr)
не сможет выражают размер такого объекта, и в целом указатели не могут даже достигнуть вершины этого массива. Компилятор обнаруживает эти ошибки и не дает вам этого сделать.
Кроме того, я полагаю, что вы пытаетесь выделить эту вещь в стеке, что обычно намного меньше, чем вся память, которую может использовать приложение, и вообще не рекомендуется выделять большие массивы там (для этого вы должны использовать кучу).
Третья ошибка: выделение всей памяти не имеет смысла. Если у вас большие требования к памяти, вы должны выделять материал в куче, а не в стеке, и выделять только ту память, которую вам нужно хорошо играть с ОС и другими приложениями (это последнее соображение не применяется, если вы работаете на встроенных системах, где вы работаете только в одном приложении).
Второй фрагмент в C++ не должен работать, поскольку, если эта вещь выделена в стеке, вы идете нестандартно, поскольку это будет VLA (доступно на C99, но сильно отклонено от текущего и следующий стандарт C++). Однако в этом случае код для выделения этого массива используется во время выполнения (VLA вообще не фиксируются в измерениях), поэтому проверка для компилятора не очевидна (хотя я полагаю, что эту вещь можно легко заметить оптимизатор, который, если семантика VLA не отличается от обычных массивов, может оптимизировать VLA и попытаться сделать регулярный массив =>, который потерпит неудачу по тем же причинам, которые я изложил).
Короче говоря: нет смысла выделять всю эту память (которую вы даже не могли адресовать), особенно в стеке. Используйте кучу и выделите только то, что вам нужно. Если у вас есть особые требования, вы должны изучить специальные функции виртуальной памяти, предоставляемые вашей ОС.
Какой компилятор это? FYI с 'const' на' size_t', оба сбой в Visual C++ v10 с «общим размером массива не должны превышать 0x7fffffff байтов» –
«Я обнаружил, что максимальный размер массива - size_t» - это неверно, 'size_t 'не является константой, это тип (точный тип typedef для неподписанного типа данных). Фактический базовый тип данных зависит от платформы. Вы можете использовать 'std :: numeric_limits :: max()' для получения максимального значения, которое может храниться в переменной типа 'size_t'. –
Praetorian
И оба эти фрагмента кода производят эту ошибку в Visual Studio 2005: «ошибка C2148: общий размер массива не должен превышать 0x7fffffff байтов» – Praetorian