2014-09-05 2 views
2

Я переношу некоторый код, и первоначальный автор явно был озабочен сжатием как можно большего количества производительности из кода.Выполнение инициализации из другого типа

На протяжении (и есть сотня исходных файлы), есть много вещей, как это:

float f = (float)(6); 
type_float tf = (type_float)(0); //type_float is a typedef of float xor double 

Короче говоря, автор попытался сделать RHS заданий равного переменным быть назначен в , Я полагаю, что цель заключалась в принуждении компилятора к созданию, например, 6 в первом примере в 6.0f, так что никакие накладные расходы на преобразование не происходят, когда это значение копируется в переменную.

Это было бы полезно для чего-то вроде второго примера, где правильная форма литерала (одна из {, 0.0}) неизвестна/может быть изменена с линии далеко. Тем не менее, я вижу, что это проблематично, если литерал преобразуется и сохраняется во временное, а затем скопирован вместо преобразования, которое происходит при копировании.

Этот автор на что-то здесь? Действительно ли все эти литералы хранятся с предполагаемым типом? Или это просто огромная трата исходных битов файла? Каков наилучший способ обработки таких случаев в современном коде?

Примечание: Я считаю, что это относится как к C, так и к C++, поэтому я применил оба тега.

+0

Нет причин, связанных с производительностью, чтобы поставить бросок с правой стороны. Довольно уверен, что это стилистический выбор. – Brian

+0

Честно говоря, броски в обоих случаях безупречны. Конверсии будут происходить независимо (если возможно). Скорее всего, автор поставил тех, кто по мандату, подавить множество предупреждений. (т. е. потери точности и т. д.). – WhozCraig

+0

Почему бы компилятор такого качества не сделал для себя такой простой вещи? – Leushenko

ответ

4

Это полный отход. Ни один современный оптимизирующий компилятор не будет отслеживать промежуточные значения, а непосредственно инициализируется с окончательным правильным значением. В этом нет никакого смысла, по умолчанию преобразование должно всегда поступать правильно, здесь. И да, это должно относиться как к C, так и к C++, и они не должны сильно отличаться в поведении.

Смежные вопросы