Почему должен быть хит производительности? Они выполняют точно те же функции, что и приведения 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