что делает const на нижних уровнях машины? - PullRequest
5 голосов
/ 28 октября 2010

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

(помимо того, что const означает, что это значит ...)

Возможно, оно хранится в .rdataраздел памяти или есть какой-то бит, который делает его постоянным или как это работает?

Кто-нибудь может уточнить?

Ответы [ 4 ]

12 голосов
/ 28 октября 2010

const в основном это время компиляции;это ничего не говорит о том, где они могут храниться во время выполнения или могут ли они быть защищены во время выполнения.

На практике компилятор может выбрать размещение констант в программном разделе исполняемого файла, что можетбыть защищенным от записи блоком управления памятью (если он существует).В качестве альтернативы компилятор может складывать константы непосредственно в код, чтобы они даже не существовали как адресуемые местоположения.

В качестве альтернативы он может ничего не делать.

8 голосов
/ 28 октября 2010

const -ness почти всегда обеспечивается компилятором, ни больше, ни меньше.Защита машины вообще отсутствует.

Редактировать: @ Оли Чарльзуорт ответ лучше моего.

3 голосов
/ 28 октября 2010

«const» не обязательно означает, что хранилище доступно только для чтения. Это объявление о том, что программа C ++ не изменит его (и, следовательно, компилятор должен отклонить любую попытку сделать это). Это не значит, что значение не изменится.

Вполне допустимо, чтобы переменная была "постоянной волатильностью" (программа не изменит ее, но она может измениться в любое время). Аппаратный порт только для чтения вполне может быть таким чудовищем, например.

Так что на «нижних уровнях машины» ничего не нужно делать. Память такая, какая она есть, и программисту приложения нужно правильно объявить вещи ..

1 голос
/ 28 октября 2010

В C ++ const редко имеет какое-либо отношение к оборудованию. В основном это способ сообщить компилятору, что определенные виды доступа должны приводить к ошибке компилятора.

Единственное исключение - статические константные переменные типа примитива или типа POD, которые обычно связаны в секции только для чтения в исполняемом образе и вызовут какую-то ошибку страницы, если вы отбрасываете константу и пытаетесь изменить один из них.

...