Подтвердить что ты не робот

Стоимость перевода reinterpret_cast

Я понимаю, что С++ reinterpret_cast и C pointer cast - это просто функциональность компиляции и что она вообще не имеет производительности.

Это правда?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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