Код: Выделить всё
extern "C" Variant test_bool(bool arg) {
return arg;
}
< /code>
Создан в основном стандартными настройками (я снял часть пути): < /p>
zig c++ -target riscv64-linux-musl -I/tests -I/tests/.zig -O3 -DNDEBUG -mcpu=baseline_rv64+rva22u64 -mabi=lp64d -O3 -std=gnu++23 -fno-stack-protector -fno-threadsafe-statics -MD -MT /test_basic.cpp.o -MF /test_basic.cpp.o.d -o /test_basic.cpp.o -c /test_basic.cpp
< /code>
Мне нужна помощь, чтобы понять, почему LLVM генерирует это: < /p>
000000000013a56a :
test_bool():
13a56a: 1141 addi sp,sp,-16
13a56c: e406 sd ra,8(sp)
13a56e: e022 sd s0,0(sp)
13a570: 0800 addi s0,sp,16
13a572: 4605 li a2,1
13a574: c110 sw a2,0(a0)
13a576: 00b50423 sb a1,8(a0)
13a57a: 60a2 ld ra,8(sp)
13a57c: 6402 ld s0,0(sp)
13a57e: 0141 addi sp,sp,16
13a580: 8082 ret
< /code>
Когда GCC правильно издает это: < /p>
0000000000012156 :
test_bool():
12156: 4705 li a4,1
12158: c118 sw a4,0(a0)
1215a: 00b50423 sb a1,8(a0)
1215e: 8082 ret
< /code>
Конструктор варианта - contexpr: < /p>
template
inline constexpr Variant::Variant(T value)
{
if constexpr (std::is_same_v) {
m_type = BOOL;
v.b = value;
}
else if constexpr (std::is_integral_v) {
...
} ...
< /code>
Вариант - это простой союз с типом: < /p>
private:
Type m_type = NIL;
union {
int64_t i;
bool b;
double f;
real_t v4[4];
int32_t v4i[4];
} v;
Подробнее здесь: https://stackoverflow.com/questions/797 ... gcc-doesnt