Оптимизация GCC для распакованной структуры не удалась?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оптимизация GCC для распакованной структуры не удалась?

Сообщение Anonymous »

Почему GCC не может оптимизировать этот код?

Код: Выделить всё

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
Подробности см. на https://godbolt.org/z/hMEoqPWoW.
Странно то, что узел можно оптимизировать, в то время как это простое наследование от узла node2 не может быть оптимизирован?
А в GCC 14.2 функция foo будет:

Код: Выделить всё

foo():
movabs  rsi, -4294967296
xor     ecx, ecx
xor     eax, eax
and     rcx, rsi
mov     rdx, rcx
ret
Что мне следует сделать, чтобы GCC оптимизировался правильно?
Я попробовал attribute((packed)), он может работает.
Но я надеюсь, что есть лучший способ решить эту проблему, обеспечив при этом выравнивание.
Ручное заполнение, возможно, также решит проблему, но оно не кажется подходящим для многих структур данных?

Подробнее здесь: https://stackoverflow.com/questions/793 ... uct-failed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»