Сколько константных переменных я могу объявить, прежде чем закончится память? - PullRequest
6 голосов
/ 08 февраля 2020

Я пишу код, который имеет много константных переменных (в основном, целых и перечислений), и мне интересно, есть ли максимальное количество переменных, которые я могу объявить? Моя идея состоит в том, что эти константные переменные размещаются в стеке, что означает, что я могу объявить около 1MB / 4bytes = 250000 переменных (что достаточно), предполагая, что размер стека составляет 1MB. Я прав?

Быстрый пример того, что я имею в виду:

Тест. cpp:

const unsigned int VECTOR_ID = 4;
const unsigned int MATRIX_ID = 3;

int main()
{
  std::cout << VECTOR_ID << " : " << MATRIX_ID << std::endl;
  return 0;
}

1 Ответ

3 голосов
/ 09 февраля 2020

Обратите внимание, что константы, которые известны во время компиляции, могут не соответствовать никаким объектам; когда вы компилируете с включенной оптимизацией, константы будут скомпилированы непосредственно в машинные инструкции как непосредственные значения. Здесь - простой пример. Это означает, что количество постоянных переменных не ограничено как таковое. Это также означает, что константы, которые вообще не используются, вероятно, исчезнут полностью. (И , если , они используются любым нетривиальным образом, размер кода будет превышать размер данных.)

Даже если ваши постоянные переменные действительно становятся объектами, например, потому что их адрес будет взят, они будут «скомпилированы в вашу программу» и станут частью исполняемого файла.

Размер программы и ее сегменты ограничены форматом исполняемого файла, системными ресурсами и, возможно, инструментами сборки. Страница Intel , по-видимому, указывает, что данные stati c (где могут заканчиваться глобальные константы) ограничены 2 ГБ при Windows даже на 64-разрядных архитектурах (что по-прежнему на три порядка больше, чем ваш вариант использования):

Обратите внимание, что ограничение для данных stati c и стека одинаково как в 32-разрядном, так и в 64-разрядном вариантах. Это связано с форматом типа файла Windows Portable Executable (PE), который используется для описания EXE-файлов и DLL-файлов в соответствии с компоновщиком. Он имеет 32-битные поля для смещения и длины сечения изображения и не был расширен для 64-битных вариантов Windows. Как и в 32-разрядных Windows, данные и стек stati c совместно используют одни и те же первые 2 ГБ адресного пространства.

Казалось, что быстрый поиск указывает на то, что этот предел отсутствует в современном Linux.

...