Насколько я знаю, глобальные константы хранятся в .data - сегменте, в read-only секции. Но что насчёт локальных констант? По идее они должны храниться на стеке, но неужели на стеке есть такая же read-only-секция?
Asked
Active
Viewed 320 times
0
n 1 k z z z
- 1,491
- 6
- 23
read-onlyсекции, то это ещё не означает, что любые константы должны храниться вread-onlyсекции. Пример изменения константной переменной (строго говоря, поведение приведённой программы не определено, это просто демонстрация идеи). – wololo May 27 '21 at 20:35const- это помощь программисту, чтобы он не наделал ошибок. Компилятор имеет право на константные переменные делать очень много оптимизации вплоть до отсутствия этой переменной в памяти, она остаётся только в ассемблерном коде. Вот здесь константа уже не меняется. Обратный пример для @wololo Константа не изменилась – AlexGlebe May 28 '21 at 07:30получается что "константа" не является константой раз ее можно изменитьПросто программа содержит неопределённое поведение — все гарантии стандарта языка снимаются, в частности, больше не гарантируется неизменность констант.А если мне нужно гарантировать ее неизменяемостьТогда не допускайте неопределённого поведения. Вот другой пример. Здесь прямой модификации константного объекта нет, но есть другое UB, которое также приводит к изменению константы. – wololo May 28 '21 at 10:33если мне нужно гарантировать ее неизменяемость ... получается что она обязательно должна быть со статической продолжительностью хранения. Ещё раз: попытка модификации константного объекта вызывает неопределённое поведение, все гарантии снимаются, результат выполнения программы никак не специфицируется. Гарантировать, что модификация статической константы приведёт к «падению программы» (если, конечно, ваша цель добиться такого поведения) нельзя. Может упадёт, а может и нет. – wololo May 28 '21 at 10:34