Подтвердить что ты не робот

Выступления структур против классов

Интересно, есть ли сравнение производительности классов и структур стиля C в С++ с опцией g++ -O3. Есть ли какой-либо бенчмарк или сравнение по этому поводу. Я всегда считал классы С++ более тяжелыми и, возможно, медленнее, чем структуры (время компиляции для меня не очень важно, время выполнения более важно). Я собираюсь реализовать B-дерево, должен ли я реализовывать его с классами или с помощью структур для производительности.

4b9b3361

Ответ 1

На уровне исполнения нет разницы между структурами и классами на С++. Таким образом, разница в производительности не влияет на использование struct A или class A в вашем коде.

Другое дело, это использование некоторых функций - например, конструкторов, деструкторов и виртуальных функций, - может иметь некоторые штрафы за производительность (но если вы их используете, они, вероятно, все равно понадобятся). Но вы можете с равным успехом использовать их как внутри вашего класса, так и структуры.

В этот документ вы можете прочитать о других связанных с производительностью тонкостях С++.

Ответ 2

В С++ struct является синтаксическим сахаром для классов, члены которых по умолчанию общедоступны.

Ответ 3

Мое честное мнение... не беспокойтесь о производительности, пока оно на самом деле не показало себя проблемой, а затем профилирует ваш код. Преждевременная оптимизация - это корень всего зла. Но, как говорили другие, нет разницы между структурой и классом в С++ во время выполнения.

Ответ 4

Сосредоточьтесь на создании эффективной структуры данных и эффективной логики для управления структурой данных. Классы С++ не являются по своей сути медленнее, чем структуры C-стиля, поэтому не позволяйте этому ограничивать ваш дизайн.

Ответ 5

AFAIK, с точки зрения производительности, они эквивалентны в С++.

Их отличие состоит в том, что synctatic sugar, например, элементы структуры, являются общедоступными по умолчанию, например.

my2c

Ответ 6

Просто сделайте эксперимент, люди!

Вот код для эксперимента, который я разработал:

#include <iostream>
#include <string>
#include <ctime>
using namespace std;
class foo {
  public:
    void foobar(int k) {
      for (k; k > 0; k--) {
        cout << k << endl;
      }
    }
    void initialize() {
      accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf";
    }
    string accessor;
};
struct bar {
  public:
    void foobar(int k) {
      for (k; k > 0; k--) {
        cout << k << endl;
      }
    }
    void initialize() {
      accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf";
    }
    string accessor;
};

int main() {
  clock_t timer1 = clock();
  for (int j = 0; j < 200; j++) {
    foo f;
    f.initialize();
    f.foobar(7);
    cout << f.accessor << endl;
  }
  clock_t classstuff = clock();
  clock_t timer2 = clock();
  for (int j = 0; j < 200; j++) {
    bar b;
    b.initialize();
    b.foobar(7);
    cout << b.accessor << endl;
  }
  clock_t structstuff = clock();
  cout << "struct took " << structstuff-timer2 << endl;
  cout << "class took " << classstuff-timer1 << endl;
  return 0;
}

На моем компьютере структура заняла 1286 тактов, а класс занял 1450 часов. Чтобы ответить на ваш вопрос, структура немного быстрее. Однако это не имеет значения, потому что компьютеры в эти дни настолько быстры.