reinterpret_cast стоимость приведения - PullRequest
40 голосов
/ 26 августа 2010

Насколько я понимаю, C ++ reinterpret_cast и C указатель приведен функциональность во время компиляции и отсутствие затрат на производительность.

Это правда?

Ответы [ 6 ]

56 голосов
/ 26 августа 2010

Это хорошее предположение для начала.Однако оптимизатор может быть ограничен в том, что он может предполагать при наличии указателя reinterpret_cast<> или C.Затем, даже если само приведение не имеет связанных инструкций, результирующий код работает медленнее.

Например, если вы приведете int к указателю, оптимизатор, вероятно, не будет знать, на что может указывать этот указатель.,В результате, вероятно, следует предположить, что запись через этот указатель может изменить любую переменную.Это лучше, чем обычные оптимизации, такие как хранение переменных в регистрах.

6 голосов
/ 26 августа 2010

Это верно.Никаких затрат, кроме выигрыша / потери производительности при выполнении инструкций на новой ширине, которые я мог бы добавить, вызывает беспокойство только в редких случаях.Кастинг между указателями на каждой платформе, о которой я когда-либо слышал, не требует затрат и не влияет на производительность.

5 голосов
/ 26 августа 2010

Приведения в стиле C в C ++ будут сначала пытаться использовать static_cast и выполнять reinterpret_cast, только если невозможно выполнить статическое приведение.Static_cast может изменить значение указателя в случае множественного наследования (или при приведении интерфейса к конкретному типу), в этом вычислении смещения может потребоваться дополнительная машинная инструкция.Это будет максимум 1 машинная инструкция, поэтому она очень мала.

1 голос
/ 26 августа 2010

reinterpret_cast не требует затрат времени исполнения. Однако вы должны быть осторожны, поскольку каждое использование reinterpret_cast определяется реализацией. Например, можно переосмыслить массив char как массив int, что может привести к тому, что целевая архитектура вызовет прерывание, поскольку разные типы могут иметь разные правила выравнивания.

Сначала поправьте, а потом беспокойтесь об эффективности.

1 голос
/ 26 августа 2010

Вы правы, но подумайте об этом: reinterpret_cast может означать плохой дизайн или что вы делаете что-то очень низкое.

Динамическое приведение вместо этого будет стоить вам что-то, потому что оно должно смотреть в таблице поиска во время выполнения.

1 голос
/ 26 августа 2010

Да, это правда. Тип приведения, который имеет стоимость выполнения, является dynamic_cast.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...