Я пытаюсь понять, почему мои компиляторы (g ++ 8.1.0 и clang ++ 6.0.0) по-разному обрабатывают POD (plain-old-data) и не POD-код.
Тестовый код:
#include <iostream>
struct slong {
int i;
~slong() { i = 0; }
};
int get1(slong x) { return 1+x.i; }
int main() {
std::cerr << "is_pod(slong) = " << std::is_pod<slong>::value << std::endl;
}
определяет класс slong
с деструктором (следовательно, не с POD), а компилятор с -Ofast выдаст для get1
movl (%rdi), %eax
incl %eax
, но когда я закомментирую деструктор (slong
становится POD) Я получаю
leal 1(%rdi), %eax
Конечно, проблема с производительностью незначительна;все же я хотел бы понять.В других (более сложных) случаях я также заметил более существенные различия в коде.