2010-08-26 5 views
33

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

Это правда?

ответ

49

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

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

+1

Я не думаю, что «обычно нет» был ответом, который вы намеревались задать, «это правда?» –

+0

@Rob Kennedy: Да, да. Перефразировано. – MSalters

+1

большое спасибо за этот ответ. Возможно, в этом случае можно указать GCC с ключевым словом register (!?). – fulmicoton

0

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

+2

'static_cast' может также иметь стоимость исполнения; хотя обычно это всего лишь одна корректировка указателя или код для скрытого одного типа для другого (например, 'int' в' float') –

+0

Не будет ли 'static_cast' также вызывать пользовательские преобразования? Стоимость исполнения на них неограничена. –

+0

Правильно, static_cast имеет стоимость исполнения в случае преобразования типа (не указателя). Я хочу сказать, что dynamic_cast - это единственный тип литья, который имеет дополнительную стоимость исполнения, относительно C casting. –

5

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

0

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

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

+0

'dynamic_cast' более сродни' static_cast' с проверкой времени выполнения, а не 'reinterpret_cast'. Вы не можете использовать полиморфные типы с 'reinterpreT_cast'. –

+1

@Billy ONeal: Вы можете, но не полиморфно знать. –

0

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

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

4

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