Код: Выделить всё
struct node {
node() = default;
node(const node &) = default;
node(node&&) = default;
node& operator=(const node &) = default;
node& operator = (node&&) = default;
~node() = default;
node (int) {}
void* a = nullptr;
int b = 0;
};
struct node2 : node{} ;
auto foo () -> node {
return {};
}
auto foo2 () -> node2 {
return {};
}
Код: Выделить всё
foo():
xor eax, eax
xor edx, edx
ret
foo2():
mov QWORD PTR [rsp-24], 0
mov rax, QWORD PTR [rsp-24]
mov DWORD PTR [rsp-16], 0
mov rdx, QWORD PTR [rsp-16]
ret
Странно то, что узел можно оптимизировать, в то время как это простое наследование от узла node2 не может быть оптимизирован?
А в GCC 14.2 функция foo будет:
Код: Выделить всё
foo():
movabs rsi, -4294967296
xor ecx, ecx
xor eax, eax
and rcx, rsi
mov rdx, rcx
ret
Я попробовал attribute((packed)), он может работает.
Но я надеюсь, что есть лучший способ решить эту проблему, обеспечив при этом выравнивание.
Ручное заполнение, возможно, также решит проблему, но оно не кажется подходящим для многих структур данных?
Подробнее здесь: https://stackoverflow.com/questions/793 ... uct-failed
Мобильная версия