Что скрытый механизм использует g++ для определения модификации переменных const?
Когда мы объявляем переменную константой
const int cv = 3;
Я предполагаю, что g++ резервирует 4 байта где-нибудь (скажем, адрес 0xFF77) в области данных. В будущем, когда люди обращаются к cv, компилятор переходит к 0xFF77, чтобы получить значение 3.
Однако как компилятор хранит информацию "const"? g++ должен каким-то образом хранить эту информацию, поэтому, когда другая строка пытается изменить cv, компилятор знает: "о, это неправильно, потому что я знаю, что 0xFF77 - это const".
Кто-нибудь здесь знаком с компилятором gcc? не могли бы вы дать мне немного понимания?
Спасибо
2 ответа
Однако как компилятор хранит информацию "const"?
Это не так. const
Ключевое слово является классификатором типа. Такое знание о константности имеет значение во время проверки типов, задачи, выполняемой внешним интерфейсом компилятора.
Если нет (недействительной) попытки изменить const
Значение - остерегаясь разницы между семантикой копирования и ссылки / указателя - найдено, серверная часть компилятора будет выдавать код. Затем данные данные помещаются в объектный файл (не обязательно в раздел только для чтения), такой как ELF.
В конце концов, ваша операционная система загрузит такой двоичный файл. Что именно происходит при модификации этого когда-то "константного объекта", либо из нарушающего выражения, не уловленного средством проверки типов компилятора, ни каким-либо навязчивым механизмом, может варьироваться.
После выполнения программы компилятор больше не присутствует. Это работа сделана; программа была скомпилирована в исполняемый файл, и затем она может быть выполнена даже без установки компилятора. (Следовательно, можно распространять исполняемые файлы на машины без компилятора.)
Но даже если ваш вопрос был переписан, чтобы решить эту проблему, есть необоснованное и неправильное предположение:
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++, вы должны быть готовы к тому, что играете по правилам.