Обратите внимание, что константы, которые известны во время компиляции, могут не соответствовать никаким объектам; когда вы компилируете с включенной оптимизацией, константы будут скомпилированы непосредственно в машинные инструкции как непосредственные значения. Здесь - простой пример. Это означает, что количество постоянных переменных не ограничено как таковое. Это также означает, что константы, которые вообще не используются, вероятно, исчезнут полностью. (И , если , они используются любым нетривиальным образом, размер кода будет превышать размер данных.)
Даже если ваши постоянные переменные действительно становятся объектами, например, потому что их адрес будет взят, они будут «скомпилированы в вашу программу» и станут частью исполняемого файла.
Размер программы и ее сегменты ограничены форматом исполняемого файла, системными ресурсами и, возможно, инструментами сборки. Страница 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.