Что скрытый механизм использует g ++ для определения модификации переменных const? - PullRequest
0 голосов
/ 27 апреля 2018

когда мы объявляем переменную как const

const int cv  = 3;

Я предполагаю, что g ++ резервирует 4 байта где-нибудь (скажем, адрес 0xFF77) в области данных. В будущем, когда люди получат доступ к cv, компилятор перейдет к 0xFF77, чтобы получить значение 3.

Однако, как компилятор хранит информацию «const»? g ++ должен каким-то образом хранить эту информацию, поэтому, когда другая строка пытается изменить cv, компилятор знает: «о, это неправильно, потому что я знаю, что 0xFF77 - это const».

Кто-нибудь здесь знаком с компилятором gcc? не могли бы вы дать мне некоторое представление?

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Однако как компилятор хранит информацию «const»?

Это не так. Ключевое слово const является квалификатором типа. Такие знания о константности имеют значение во время проверки типов, задачи, выполняемой внешним интерфейсом компилятора.

Если не найдена (недопустимая) попытка изменить значение const - учитывая разницу между семантикой копирования и ссылки / указателя - серверная часть компилятора будет генерировать код. Затем данные данные помещаются в объектный файл (не обязательно в раздел только для чтения), такой как ELF.

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

0 голосов
/ 27 апреля 2018

После выполнения программы компилятор больше не присутствует. Это работа сделана; программа была скомпилирована в исполняемый файл, и затем она может быть выполнена даже без установки компилятора. (Следовательно, можно распространять исполняемые файлы на машины без компилятора.)

Но даже если ваш вопрос был переписан для устранения этой проблемы, существует необоснованное и неправильное предположение:

g ++ должен каким-то образом хранить эту информацию, поэтому, когда другая строка пытается изменить cv, во время выполнения знает: «О, это неверно, потому что я знаю, что 0xFF77 является const».

Фактически, среда выполнения не обязана останавливать изменение переменной. Это ответственность программиста. Когда вы объявляете переменную const, вы сообщаете компилятору, что не будете изменять ее значение, что может позволить компилятору лучше оптимизировать работу. Такая оптимизация может потерпеть неудачу, если окажется, что вы действительно изменили переменную; это объясняется тем фактом, что изменение объявленного значения const является «неопределенным поведением». (Неопределенное поведение действительно не определено. Выдача ошибки будет определенным поведением.)

При определенных обстоятельствах компилятор может фактически обнаружить во время компиляции, что переменная, объявленная const, изменяется.

const int cv = 3;
cv = 42;

Большинство компиляторов выдадут предупреждение, если увидят вопиющее нарушение договора. Но это предупреждение, а не ошибка, и бывают случаи, когда компилятор вводится в заблуждение. Например, следующий код не может выдать ошибку, если предположить, что функция always_false соответствует своему имени:

const int cv = 3;
if (always_false(cv)) cv = 42;

Короче говоря, C ++ не обязуется спасать вас от ваших ошибок; если вы решили писать программы на C ++, вы должны быть готовы к тому, что играете по правилам.

...