0

Насколько я знаю, глобальные константы хранятся в .data - сегменте, в read-only секции. Но что насчёт локальных констант? По идее они должны храниться на стеке, но неужели на стеке есть такая же read-only-секция?

n 1 k z z z
  • 1,491
  • 6
  • 23
  • Да нигде они не хранятся, если нет повода их хранить. – Qwertiy May 27 '21 at 20:04
  • https://stackoverflow.com/q/583076/9210255 – TigerTV.ru May 27 '21 at 20:05
  • в read-only хранятся константы времени компиляции, то бишь куски исполняемого файла – user7860670 May 27 '21 at 20:30
  • 2
    Если некоторые константы хранятся в read-only секции, то это ещё не означает, что любые константы должны храниться в read-only секции. Пример изменения константной переменной (строго говоря, поведение приведённой программы не определено, это просто демонстрация идеи). – wololo May 27 '21 at 20:35
  • @wololo, тогда уже получается что "константа" не является константой раз ее можно изменить. А если мне нужно гарантировать ее неизменяемость не только во время компиляции программы, но и на этапе её выполнения, получается что она обязательно должна быть со статической продолжительностью хранения, верно? – n 1 k z z z May 28 '21 at 07:09
  • const - это помощь программисту, чтобы он не наделал ошибок. Компилятор имеет право на константные переменные делать очень много оптимизации вплоть до отсутствия этой переменной в памяти, она остаётся только в ассемблерном коде. Вот здесь константа уже не меняется. Обратный пример для @wololo Константа не изменилась – AlexGlebe May 28 '21 at 07:30
  • получается что "константа" не является константой раз ее можно изменить Просто программа содержит неопределённое поведение — все гарантии стандарта языка снимаются, в частности, больше не гарантируется неизменность констант. А если мне нужно гарантировать ее неизменяемость Тогда не допускайте неопределённого поведения. Вот другой пример. Здесь прямой модификации константного объекта нет, но есть другое UB, которое также приводит к изменению константы. – wololo May 28 '21 at 10:33
  • если мне нужно гарантировать ее неизменяемость ... получается что она обязательно должна быть со статической продолжительностью хранения. Ещё раз: попытка модификации константного объекта вызывает неопределённое поведение, все гарантии снимаются, результат выполнения программы никак не специфицируется. Гарантировать, что модификация статической константы приведёт к «падению программы» (если, конечно, ваша цель добиться такого поведения) нельзя. Может упадёт, а может и нет. – wololo May 28 '21 at 10:34
  • 1
    "А если мне нужно гарантировать ее неизменяемость не только во время компиляции программы, но и на этапе её выполнения..." - ... то вы же сами и должны это гарантировать. В С++ за то, что объекты с const квалификатором не изменяются во время выполнения (как и за многие другие вещи) отвечает программист. Если хотите гарантий, то используйте Ada/SPARK с верификацией. – user7860670 May 28 '21 at 16:57

0 Answers0