Мое понимание заключается в том, что C++ reinterpret_cast и C pointer cast - это всего лишь функция времени компиляции и что она вообще не имеет производительности.reinterpret_cast стоимость литья
Это правда?
Мое понимание заключается в том, что C++ reinterpret_cast и C pointer cast - это всего лишь функция времени компиляции и что она вообще не имеет производительности.reinterpret_cast стоимость литья
Это правда?
Это хорошее предположение для начала. Однако оптимизатор может быть ограничен тем, что он может принять в присутствии reinterpret_cast<>
или C-указателя. Затем, несмотря на то, что сам листинг не имеет соответствующих инструкций, полученный код медленнее.
Например, если вы наложили int на указатель, оптимизатор, вероятно, не имеет представления о том, что может указывать этот указатель. В результате, вероятно, следует предположить, что запись через этот указатель может изменить любую переменную. Это превосходит очень общие оптимизации, такие как хранение переменных в регистрах.
Да, это правда. Тип каста, который имеет стоимость исполнения, - dynamic_cast.
'static_cast' может также иметь стоимость исполнения; хотя обычно это всего лишь одна корректировка указателя или код для скрытого одного типа для другого (например, 'int' в' float') –
Не будет ли 'static_cast' также вызывать пользовательские преобразования? Стоимость исполнения на них неограничена. –
Правильно, static_cast имеет стоимость исполнения в случае преобразования типа (не указателя). Я хочу сказать, что dynamic_cast - это единственный тип литья, который имеет дополнительную стоимость исполнения, относительно C casting. –
Правильно. Никакие затраты, кроме любой выгоды/потери производительности для выполнения инструкций на новой ширине, которые я мог бы добавить, являются лишь проблемой в редких случаях. Кастинг между указателями на каждой платформе, о которой я когда-либо слышал, имеет нулевую стоимость, и никаких изменений в производительности не происходит.
Вы правы, но подумайте об этом: reinterpret_cast означает, может быть, плохой дизайн или что вы делаете что-то очень низкое.
dynamic-cast вместо этого будет вам что-то стоить, потому что он должен искать в таблице поиска во время выполнения.
'dynamic_cast' более сродни' static_cast' с проверкой времени выполнения, а не 'reinterpret_cast'. Вы не можете использовать полиморфные типы с 'reinterpreT_cast'. –
@Billy ONeal: Вы можете, но не полиморфно знать. –
reinterpret_cast
не несет затраты времени на выполнение. Однако вы должны быть осторожны, так как каждое использование reinterpret_cast
является реализацией. Например, возможно реинтерпретирование массива char
в качестве массива int
может привести к тому, что целевая архитектура вызовет прерывание, поскольку разные типы могут иметь разные правила выравнивания.
Сначала вернитесь, а затем подумайте об эффективности.
Стили стиля C на C++ сначала попытаются выполнить static_cast и выполняют только reinterpret_cast, если статическое приведение не может быть выполнено. Static_cast может изменить значение указателя в случае множественного наследования (или при литье интерфейса на конкретный тип), это вычисление смещения может включать дополнительную машинную инструкцию. Это будет, по крайней мере, 1 машинная инструкция, поэтому действительно очень маленькая.
Я не думаю, что «обычно нет» был ответом, который вы намеревались задать, «это правда?» –
@Rob Kennedy: Да, да. Перефразировано. – MSalters
большое спасибо за этот ответ. Возможно, в этом случае можно указать GCC с ключевым словом register (!?). – fulmicoton