Разница в производительности между классами POD и не POD - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь понять, почему мои компиляторы (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

Конечно, проблема с производительностью незначительна;все же я хотел бы понять.В других (более сложных) случаях я также заметил более существенные различия в коде.

1 Ответ

0 голосов
/ 11 февраля 2019

Обратите внимание, что movl обращается к памяти, а leal - нет.

При передаче struct функции по значению ABI может вставить ее в регистр (rdi), еслиэто POD.

Если struct не является POD, ABI должен передать его в стек (предположительно, потому что код может нуждаться в своем адресе для вызова деструктора, доступа к vtable и выполнения других сложных операций).Так что доступ к его члену требует косвенного обращения.

...