Зачем было бы падение производительности? Они выполняют точно те же функции, что и C-приведения. Единственное отличие состоит в том, что они отлавливают больше ошибок во время компиляции, и их проще искать в исходном коде.
static_cast<float>(3)
в точности эквивалентно (float)3
и генерирует точно такой же код.
Учитывая float f = 42.0f
reinterpret_cast<int*>(&f)
в точности эквивалентен (int*)&f
и генерирует точно такой же код.
И так далее. Единственный различий, который отличается, это dynamic_cast
, который, да, может вызвать исключение. Но это потому, что он делает то, что не может делать актерский стиль. Так что не используйте dynamic_cast
, если вам не нужны его функции.
Обычно можно с уверенностью предположить, что авторы компиляторов умны. Учитывая два разных выражения, которые имеют одинаковую семантику в соответствии со стандартом, обычно можно с уверенностью предположить, что они будут реализованы одинаково в компиляторе.
Упс : Второй пример должен быть reinterpret_cast, а не dynamic_cast, конечно. Исправлено сейчас.
Хорошо, просто чтобы прояснить ситуацию, вот что говорит стандарт C ++:
§5.4.5:
Преобразования, выполненные
- a
const_cast
(5.2.11)
- a
static_cast
(5.2.9)
- a
static_cast
, за которым следует const_cast
- a
reinterpret_cast
(5.2.10) или
- a
reinterpret_cast
, за которыми следует const_cast
.
может быть выполнено с использованием броска
запись явного преобразования типа.
Те же семантические ограничения и
поведение применяется. Если преобразование может
быть интерпретированы в более чем одном из
способы, перечисленные выше, интерпретация
который появляется первым в списке
используется, даже если приведение в результате
эта интерпретация неверна.
Так что если что-нибудь , поскольку приведение в стиле C реализовано в терминах приведений C ++, приведение в стиле C должно быть медленнее . (конечно, это не так, потому что компилятор генерирует один и тот же код в любом случае, но это более правдоподобно, чем броски в стиле C ++, которые выполняются медленнее.)