В чем разница между 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++. Я был очень смущен этим.

Другие вопросы по тегам