Каков тип размера std :: array и, если он больше размера, доступного в стеке, генерирует ли он исключение? - PullRequest
0 голосов
/ 30 марта 2020

Я использую MSVC ++.

Если я определяю std::array с размером больше 2^31 - 1, я получаю эту ошибку:

C2148 общий размер массива должен не превышает 0x7fffffff байт

Это заставляет меня сделать вывод, что тип для размера - это 32-разрядное целое число со знаком. Но зачем использовать целое число со знаком для размера? так как нет отрицательного размера, не лучше ли, если размер может go до 0xffffffff?

Вот интересная вещь, которая происходит со мной:

Если я объявить std :: массив размером 10000000024, я получаю ошибку выше. Но если я разрешу размер 10000000024 * 64, программа скомпилируется без проблем.

У меня возникает два вопроса:

1 - почему это происходит?

2 - я не думаю, что стек такой большой, чтобы содержать массив с таким размером. Выделен ли массив в куче, например, если он большой? и если нет, что произойдет, если размер массива превысит размер стека? это исключение?

1 Ответ

2 голосов
/ 30 марта 2020

Каков тип размера std :: array

Это std::size_t, который является определяемым реализацией целочисленным типом без знака, который достаточно большой, чтобы содержать размер в байтах любого объекта .

1 - почему это происходит?

Согласно сообщению, это происходит потому, что всего " размер массива не должен превышать 0x7fffffff байт ". Похоже, что это ограничение конкретной реализации языка.

Для чего это стоит, стандарт C ++ предлагает 0x40000 в качестве рекомендации для минимального ограничения максимального размера объекта. 0x7fffffff превышает эту рекомендацию с большим отрывом. В системе x86-64 Linux максимальный размер объекта составляет 0x7fffffffffffffff.

Выделен ли массив, например, в куче, если он большой?

Место, в котором выделяется память для объекта, зависит от типа используемого хранилища и от реализации языка. Размер объекта обычно не влияет на это. std::array никогда не выделяет динамическую c память.

что произойдет, если размер массива превысит размер стека?

Это не имеет значения как превышен размер стека выполнения. Язык не определяет, что происходит, и не признает существование «стека». Это концепция реализации c. Таким образом, то, что происходит, зависит от реализации. Если вам повезет, программа вылетает. Если вам не повезло, ваши секреты хакерам.

...