Я использую MSVC++.
Если я определяю std::array
с размером больше, чем 2^31 - 1
, я получаю эту ошибку:
C2148 общий размер массива не должен превышать
0x7fffffff
байт
Это заставляет меня сделать вывод, что типом размера является 32-битное целое число со знаком. Но зачем использовать целое число со знаком для размера? поскольку нет отрицательного размера, не было бы лучше, если бы размер мог доходить до 0xffffffff
?
Вот интересная вещь, которая происходит со мной:
Если я объявляю массив std::array размером 10000000024
, я получаю указанную выше ошибку. Но если я позволю размеру быть 10000000024 * 64
, программа скомпилируется без каких-либо проблем.
Это вызывает у меня два вопроса:
1 - почему это происходит?
2 - Я не думаю, что стек настолько велик, чтобы вместить массив такого размера. Выделяется ли массив в куче, например, если он большой? а если нет, что произойдет, если размер массива превысит размер стека? это исключение?
10000000024 * 64
переполняет 32-битное целое число и переходит к 49874432, что намного меньше 10000000024. - person Igor Tandetnik   schedule 30.03.2020std::size_t
(обычноunsigned long
), но реализации имеют ограничения на фактическая длина массива, который вы можете определить. - person Ken Y-N   schedule 30.03.2020