В чем разница между константой и неизменяемой в D? - программирование
Подтвердить что ты не робот

В чем разница между константой и неизменяемой в D?

В чем разница между квалификаторами типа const и immutable в D?

4b9b3361

Ответ 1

Что-то, что есть const, не может быть мутировано с помощью этой ссылки, но может быть мутировано изменчивой ссылкой на те же данные. Что-то, что есть immutable, не может быть изменено какой-либо ссылкой на эти данные. Итак, если у вас

const C c = foo();

то вы знаете, что вы не можете мутировать объект, на который ссылается c через c, но в вашем коде могут существовать другие ссылки на объект, на который ссылается c, и если они изменяемы, они могут мутировать его и, следовательно, изменить то, что видит c. Но если у вас

immutable C c = foo();

то вы знаете, что невозможно изменить объект, на который указывает c. После того как объект immutable был создан, он запрещен для его мутации и, если вы не подорвете систему типов с помощью кастинга, даже не возможно иметь изменяемую ссылку на объект immutable. А поскольку объекты immutable могут быть помещены в постоянную память, только если компилятор захочет, вы можете получить segfaults и т.д., Если вы когда-либо пытались отбросить immutable и мутировать объект. То же самое относится к const, так как ссылка const может действительно ссылаться на объект immutable. Отбрасывая либо const, либо immutable, а затем мутируя затем изменяемый объект, это поведение undefined и в принципе никогда не будет выполнено.

И поскольку объект immutable никогда не может быть мутирован даже с помощью другой ссылки, чтение объекта immutable из нескольких потоков является полностью потокобезопасным. Таким образом, объекты immutable неявно разделяются между потоками, тогда как все остальное, которое явно не помечено shared, считается поточно-локальным. immutable также предоставляет лучшие возможности оптимизации компилятору, чем const, потому что он гарантированно никогда не изменяется, тогда как объект const может меняться через другую ссылку на те же данные.

Для типов значений нет большой разницы между const и immutable (так как вы не можете иметь изменяемые ссылки на непеременные типы значений), но для ссылочных типов существует значительная разница.

Ответ 2

Когда вы объявляете что-то как const, вы обещаете, что не будете его изменять. Когда что-то объявлено как immutable, вы получаете обещание, что он не будет изменен в другом месте (или, конечно, вы не можете его изменить)

Ответ 3

Они различаются в данных immutable, могут фактически помещаться в разделы только для чтения памяти, и, следовательно, любые попытки изменить данные, которые он будет терпеть неудачу.

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

Таким образом, "constness" можно обойти в таком случае, в то время как неизменность не может.

(Ссылка)

Ответ 4

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

Он не имеет большого смысла для значений, которые копируются с присваиванием типа char, int или float.

Понятие const и неизменяемое сильно отличается от понятия, найденного в C и С++. Я был очень смущен этим.