Ответ 1
Компилятор будет "создавать" точно такое же количество удвоений. Нет никакой практической разницы между литьем и построением примитивных числовых типов.
Да, я знаю, что вы не должны использовать C-стили в С++, но в некоторых случаях я действительно считаю это более читаемым, если вы это сделаете, сравните эти два, например:
d = ((double)i * 23.54) / (d + (double)j);
d = (static_cast<double>(i) * 23.54) / (d + static_cast<double>(j));
Какой из них более читабельен?
Теперь на мой главный вопрос. Очевидно, я предпочитаю верхний, но есть один способ сделать его еще более удобочитаемым по моему мнению:
d = (double(i) * 23.54) / (d + double(j));
Мой вопрос здесь, будет ли это менее эффективным? Будет ли компилятор создавать больше удвоений в этом случае, чем если бы они были заброшены другими методами, или достаточно ли это достаточно? Является ли это более или менее плохим, чем типичные стили C-стиля?
Компилятор будет "создавать" точно такое же количество удвоений. Нет никакой практической разницы между литьем и построением примитивных числовых типов.
Они все нечитаемы. Вы должны написать:
d = (i * 23.54) / (d + j);
Я уже прокомментировал ответ R о том, чтобы позволить компилятору выбрать листинг в этом конкретном случае.
Однако есть случаи, когда вы хотите явное преобразование:
Boost Numeric Conversion обеспечивает очень подходящий приведение здесь, намного лучше, чем static_cast
: boost:: numeric_cast
Это более читаемо, чем static_cast
, так как сама природа чисел выделена и намного безопаснее, поскольку она предотвращает поведение undefined (и проблемы с переносимостью).
Причина, по которой функции наложения в С++ долговечны, по дизайну 1), чтобы показать пользователю, что он, вероятно, делает что-то неправильно 2) в тех случаях, когда они необходимы, обратите внимание на этот фрагмент кода, что он может делать что-то опасное или нетрадиционное.
IMHO, static_cast один более читабельен, поскольку он предоставляет читателю информацию о характере трансляции.
Я предлагаю вам скомпилировать сборку (если ваш компилятор поддерживает такую опцию). Например, опция Gnu С++ -S выведет сборку, чтобы вы могли убедиться сами.