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