Хотя я ценю вывод сборки, я все еще нахожу их «слишком» низкоуровневыми:)
Для следующего кода:
struct Foo { Foo(): i(0) {} Foo(int i): i(i) {} int i; };
struct Bar { Bar(double d): d(d) {} double d; operator Foo() const { return Foo(d); } };
Foo If(bool cond) {
if (cond) { return Foo(); }
return Bar(3);
}
Foo Ternary(bool cond) {
return cond ? Foo() : Bar(3);
}
Вот LLVM IR, сгенерированныйClang
define i64 @If(bool)(i1 zeroext %cond) nounwind readnone {
entry:
%retval.0.0 = select i1 %cond, i64 0, i64 3 ; <i64> [#uses=1]
ret i64 %retval.0.0
}
define i64 @Ternary(bool)(i1 zeroext %cond) nounwind readnone {
entry:
%tmp.016.0 = select i1 %cond, i64 0, i64 3 ; <i64> [#uses=1]
ret i64 %tmp.016.0
}
Кстати, демоверсия llvm теперь использует Clang: p
Поскольку вопрос возникает не впервые, вв той или иной форме я хотел бы помнить, что, поскольку семантически обе формы эквивалентны, у хорошего компилятора нет оснований так или иначе относиться к ним с точки зрения оптимизации и генерации кода.Тернарный оператор - это просто синтаксический сахар.