2013-08-26 2 views
9

static_cast<T>(...) Что-то, что делается во время компиляции или во время выполнения? Я искал googled, но у меня разные ответы.Is static_cast <T> (...) время компиляции или время выполнения?

Кроме того, dynamic_cast<T>(...) - это, очевидно, время работы - но как насчет reinterpret_cast<T>(...)?

+3

«Статический» ... ключ от имени. –

+0

static_cast не выполняет проверки выполнения. – dare

+2

Судя по существующим ответам, более важный вопрос, который должен быть решен здесь, - это то, что вы подразумеваете под * «выполняется во время компиляции» *. В то время как преобразование в использование выбрано во время компиляции, фактическое само преобразование может (и обычно будет) очень хорошо приводить к коду преобразования, который должен выполняться во время выполнения. –

ответ

8

В зависимости от того, что вы делаете, что еще. Например. static_cast<std::string>("Hello") заканчивается вызовом std::string конструктор.

Сверху моей головы я не могу придумать ни одного случая, когда reinterpret_cast необходимо было бы генерировать фактические машинные инструкции. Это просто говорит компилятору: возьмите этот бит-шаблон и считайте его значением такого типа.

+0

О, интересно. Каковы правила для этого? Это происходит, когда я накладываю 'int' на' float'? И когда я накладываю 'float' на' int'? –

+0

Оба, вероятно, должны сгенерировать некоторые машинные инструкции, если вы не набираете константу времени компиляции (то есть, если вы пишете «static_cast (42)», компилятор обычно будет достаточно умным, чтобы просто заменить его на «42f» во время компиляции). –

+0

Будет ли это оптимизировано с помощью '-O3'? Или я должен использовать 'reinterpret_cast', когда я уверен в том, что я делаю для высокопроизводительных числовых нажатий? –

4

Время компиляции. Фактически, компилятор даже не вставляет код времени выполнения, чтобы проверить правильность результата. Компилятор действительно проверяет, что преобразование статически возможно, конечно. Пример: литье из подкласса в суперкласс. Если для преобразования требуется задействовать встроенную функцию или функцию кастинга, они будут выполняться во время выполнения, конечно, но проверка типа не будет.

+2

Даже приведение от подкласса к суперклассу может привести к созданию кода времени выполнения, например. когда упомянутый суперкласс фактически является виртуальным базовым классом. –

+0

@IgorTandetnik Право. Я имел в виду код проверки типов. Пытался исправить двусмысленность (или обычную ошибку! :-)). –