2011-03-25 2 views
21

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

+4

Какую из ваших близнецов вы любите больше всего? –

+2

На самом деле, я никогда не использовал расширенные возможности структур C++, я всегда использовал их как контейнер данных для общедоступных данных, как C struct. Когда мне нужны сложные функции, такие как наследование, полиморфизм и т. Д., Я предпочитаю использовать классы. Так что это не отношения любви и ненависти. – systemsfault

ответ

46

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

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

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

+0

Знаете ли вы какой-либо документ или контрольные показатели их потребления памяти: structs vs classes. – systemsfault

+8

Еще раз: нет разницы между структурами и классами на уровне выполнения - как производительность, так и потребление памяти. Вы можете думать о них как о разных ключевых словах для одной и той же вещи, которая отличается только доступом по умолчанию к членам и режимом наследования по умолчанию (и вы не можете использовать «struct» внутри списка параметров шаблона, но ваш вопрос не об этом, не так ли?) –

2

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

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

my2c

17

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

+9

Или глядя на это по-другому, 'struct' - это синтаксис, который обратно совместим с C, а' class' является более синтаксическим сахаром, подобным OOP, для классов, чьи члены являются закрытыми по умолчанию ... –

+6

Я бы хотел дать этот ответ +1.000.000 (только слегка затянувшись;)), если бы мог, поскольку такое заблуждение, которое приводит к первому вопросу, настолько широко распространено. поэтому все повторяют за мной: «**« struct »и« class »эквивалентны ** (за исключением доступа по умолчанию)« –

+1

Я воздерживаюсь от сахара. могу ли я иметь структуру, свободную от сахара? –

3

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

+1

Он четко задал вопрос о различиях между классами и структурами, а не о советах по разработке программного обеспечения. – Tara

7

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

0

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

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

#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 тикают часы. Чтобы ответить на ваш вопрос, структура немного быстрее. Однако это не имеет значения, потому что компьютеры в эти дни так быстрей.

+0

На самом деле, этот тест может быть не оптимальным, первый тест будет занимать больше времени, чем второй, так как процессор должен будет подготовиться к его выполнению. Было бы лучше запустить обе петли несколько раз, прежде чем принимать меры и избегать использования IO, поскольку это значительно затрудняет точность измерения. Я сделал несколько изменений в вашем тесте, и мои результаты показали, что обе имеют одинаковую производительность, иногда один идет немного быстрее, в другое время, то есть: (класс: 1116, 530, 523, 507) (struct: 1087, 498, 541 , 543). – VinGarcia

+0

Мой оригинальный код должен был это сделать, но я удалил его случайно, поэтому я просто написал быстрый и грязный код для публикации :) – ndrewxie

Смежные вопросы