2016-11-14 7 views
1

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

Что неясно:

  1. Как это обязательство (быть неизменным) достигается с помощью компилятора, операционной системы (процессы, потоки), аппаратное обеспечение (CPU, RAM) родственным и т.д. - то есть «как целая система «маркирует» эту ячейку (ы) для лечения таким особым образом ».
  2. Использует ли «const» в коде (C/C++) ухудшение производительности, для чрезвычайно эффективных приложений и зависит ли он от компилятора (если да - укажите, на каком именно)?
+3

«Использование« const »в коде (C/C++) ухудшает производительность», nope; если что-то это поможет производительности. – George

+0

'const 'не имеет ничего общего с операционной системой, если только он не находится в исходном коде операционной системы. 'Const' видна только компилятору. –

ответ

2

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

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

+0

Итак, я понимаю, что операционная система не знает, какой определенный объект переменной const или нет в коде. Это означает, что во время выполнения, если поток кода пытается изменить переменную const или объект - эта ситуация невозможна, а компилятор предотвратит ее по ошибке. –

+0

Компилятор предотвратит модификацию объектов 'const' (создавая ошибку), но, как я уже сказал, даже это можно преодолеть простым произведением. Во время работы система и ОС вообще не знают о постоянной памяти, поэтому ее функция безопасности (вредоносный код может ее модифицировать) – Smeeheey

7

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

const_cast ИНГ это const прочь (ложь компилятора), а данные хранятся в предназначенном только для чтения сегмента и пытается перезаписать это приведет к непредсказуемому поведению, поэтому компилятор может полагаться на программист не делает этого и может поэтому увеличить скорость.

Компилятор является единственным ответственным за оптимизацию этой части, а не за операционную систему «» (процессы, потоки), аппаратное обеспечение (ЦП, ОЗУ) ».

+1

Вот хороший пример того, как использование 'const' увеличивает производительность :) https: // youtu. be/zBkNBP00wJE? t = 27m13s – Rakete1111

2

Этот вопрос article от Herb Sutter отвечает на большинство ваших вопросов.

Когда переменная const, компилятор предполагает, что переменная не была изменена в этой области и использует эту информацию для оптимизации кода.

Любая попытка изменить это приведет к неопределенному поведению:

За исключением, что любой член класса объявлен изменяемый (7.1.1) может быть изменен, любая попытка модифицировать константный объект в течение его срока службы (3.8) результаты в неопределенном поведении.

+3

Я не буду DV, но это комментарий. Когда у вас будет достаточно репутации, вы сможете оставлять комментарии (я знаю, что это немного смешно, но их правила). – George

+1

[Ответы только на ссылку не являются хорошими и становятся недействительными, когда ссылка гниет] (http://meta.stackexchange.com/q/8231/230282). Вы должны хотя бы суммировать некоторую информацию из ссылки, иначе ваш ответ будет опущен и/или удален. Http://meta.stackoverflow.com/q/298957/995714 –

4

Я понимаю абстрактную функциональность этих трюков с «Уст» являются по вопросам безопасности

Ну, const Несс не трюк, и это не проблема безопасности в том смысле, что фраза обычно используется

... не давайте программист непреднамеренно изменить положение вещей ...

Да, const говорит компилятору - и других разработчиков, включая ваше будущее себя - что вы не намерены мутировать что-то

... или не натворить намеренно ...

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

... Как это обязательство (быть неизменным) достигается с помощью компилятора ...

Вот так. Это все. Компилятор отказывается компилировать код, который мутирует const объектов. Если код, который мутирует объекты const, не компилируется, во время выполнения ничего не нужно делать, и ничего не происходит.

Есть других защиты, в зависимости от вашей операционной системы и аппаратной платформы, от записи в область памяти вашего процесс не должен быть в состоянии изменить: смотрите, например, в UNIX мире SEGV, который, как правило, в жизни вашей памяти аппаратное обеспечение сопоставления адресов и ОС, работающие вместе.

Эти концепции времени исполнения не выражаются непосредственно на языке, хотя они влияют на то, как язык может быть реализован на данной платформе.

... ли с помощью «сопзЬ» в (C/C++) код ухудшать производительности ...

Нет, const обычно используется, чтобы более ясно, как ваш код предназначен для выражения вести себя, и эта дополнительная информация иногда позволяет компилятору сделать более оптимизаций. Я не могу придумать очевидную причину, по которой он будет делать что-то медленнее, если только оно не приведет к копиям, которые можно избежать в противном случае.

1

Как это обязательство (быть неизменным) достигается с помощью компилятора, операционной системы (процессы, потоки), аппаратных (CPU, RAM) связаны между собой, и т.д. - то есть «как вся система„метки“это (ы) для лечения в таким особым способом ».

const навязывает контракт только для чтения, и нарушение этого договора всегда будет пойман во время компиляции - для правильного (стандартный конформным код) кода ; и за исключением const_cast.

Компилятор обычно хорошо знает свою целевую архитектуру. И использование const правильно может помочь ему структурировать код, сгенерированный специальными способами для улучшения безопасность и возможно скорость. Примечание: const никогда не ухудшит скорость, если ваш компилятор не сломался.

const объекты могут храниться в постоянной памяти или в специальной памяти, которая может быть помечена как доступная только для чтения (что обеспечивает безопасность аппаратного обеспечения, попытка записи после маркировки памяти как только для чтения) Нарушение доступа Исключение

ли с помощью «сопзЬ» в (C/C++) код ухудшать производительности, для чрезвычайно эффективных приложений, и это зависит от компилятора (если да. - просьба указать, на котором он делает)?

Нет, это не так. Если это так, то этот компилятор неисправен.