В чем разница между const и неизменным в D?
В чем разница между const
а также immutable
классификаторы типа в D?
4 ответа
Что-то 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
а затем мутирование тогда изменяемого объекта является неопределенным поведением и в принципе никогда не должно выполняться.
И с тех пор immutable
объект никогда не может быть видоизменен даже по другой ссылке, читая immutable
Объект из нескольких потоков является полностью потокобезопасным. Так, immutable
объекты неявно разделяются между потоками, тогда как все остальное, что явно не помечено как shared
считается локальным потоком. immutable
также обеспечивает лучшие возможности оптимизации для компилятора, чем const
делает, потому что это гарантированно никогда не изменится, тогда как const
объект может измениться посредством другой ссылки на те же данные.
Для типов значений нет большой разницы между const
а также immutable
(поскольку у вас не может быть изменяемых ссылок на не изменяемые типы значений), но для ссылочных типов есть существенная разница.
Когда вы объявляете что-то как const
, вы обещаете, что не будете изменять его. Когда что-то объявлено как immutable
вам обещают, что он не будет изменен где-то еще (и, конечно, вы не можете изменить его тоже)
Они разные в этом immutable
данные, могут фактически помещаться в секции памяти, доступные только для чтения, и, следовательно, при любых попытках изменить данные они потерпят неудачу.
Что-то заявлено const
(и не является неизменяемым), с другой стороны, существует в разделе r/w, и значение все еще может быть изменено посредством другой неконстантной ссылки на него.
Таким образом, "постоянство" можно обойти в таком случае, а неизменность - нет.
( Ссылка)
Переменная объявлена типа const
может принять изменяемое значение или неизменное значение. Это определение относится к ссылочным типам, таким как массивы и объекты или указатели. Обычно он используется для аргументов функции. Таким образом, в D const является своего рода подстановочным атрибутом для изменяемых и неизменяемых значений.
Это не имеет большого смысла для значений, которые копируются с помощью присваивания, такого как char, int или float.
Понятие const и immutable очень отличается от того, что можно найти в C и C++. Я был очень смущен этим.