В чем разница между квалификаторами типа const
и immutable
в D?
В чем разница между константой и неизменяемой в D?
Ответ 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 и С++. Я был очень смущен этим.