Интересно, есть ли сравнение производительности классов и структур стиля C в C++ с опцией g ++ -O3. Есть ли какой-либо бенчмарк или сравнение по этому поводу. Я всегда считал классы C++ более тяжелыми и, возможно, медленнее, чем структуры (время компиляции для меня не очень важно, время выполнения более важно). Я собираюсь реализовать B-дерево, должен ли я реализовать его с классами или с помощью структур для производительности.Выполнения структур с классами
ответ
На уровне исполнения нет разницы между структурами и классами в C++ вообще. Таким образом, это не означает, что вы используете struct A
или class A
в своем коде.
Другое дело, использует некоторые функции - например, конструкторы, деструкторы и виртуальные функции, - может иметь некоторые штрафы за производительность (но если вы их используете, они, вероятно, в них нуждаются). Но вы можете с равным успехом использовать их как внутри вашего класса, так и структуры.
В this document вы можете прочитать о других связанных с производительностью тонкостях C++.
Знаете ли вы какой-либо документ или контрольные показатели их потребления памяти: structs vs classes. – systemsfault
Еще раз: нет разницы между структурами и классами на уровне выполнения - как производительность, так и потребление памяти. Вы можете думать о них как о разных ключевых словах для одной и той же вещи, которая отличается только доступом по умолчанию к членам и режимом наследования по умолчанию (и вы не можете использовать «struct» внутри списка параметров шаблона, но ваш вопрос не об этом, не так ли?) –
AFAIK, с точки зрения производительности, они эквивалентны в C++.
Их отличие - это синтатический сахар, как, например, члены структуры являются общедоступными по умолчанию.
my2c
В C++ struct
является синтаксический сахар для классов, члены которых являются открытыми по умолчанию.
Или глядя на это по-другому, 'struct' - это синтаксис, который обратно совместим с C, а' class' является более синтаксическим сахаром, подобным OOP, для классов, чьи члены являются закрытыми по умолчанию ... –
Я бы хотел дать этот ответ +1.000.000 (только слегка затянувшись;)), если бы мог, поскольку такое заблуждение, которое приводит к первому вопросу, настолько широко распространено. поэтому все повторяют за мной: «**« struct »и« class »эквивалентны ** (за исключением доступа по умолчанию)« –
Я воздерживаюсь от сахара. могу ли я иметь структуру, свободную от сахара? –
Фокус на создании эффективной структуры данных и эффективной логики для управления структурой данных. Классы C++ не являются по своей сути медленнее, чем структуры C-стиля, поэтому не позволяйте этому ограничивать ваш дизайн.
Он четко задал вопрос о различиях между классами и структурами, а не о советах по разработке программного обеспечения. – Tara
Мое честное мнение ... не беспокойтесь о производительности, пока оно на самом деле не показало себя проблемой, а затем профилирует ваш код. Преждевременная оптимизация - это корень всего зла. Но, как говорили другие, нет разницы между структурой и классом в C++ во время выполнения.
Просто сделайте эксперимент, люди!
Вот код для эксперимента я разработал:
#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 тикают часы. Чтобы ответить на ваш вопрос, структура немного быстрее. Однако это не имеет значения, потому что компьютеры в эти дни так быстрей.
На самом деле, этот тест может быть не оптимальным, первый тест будет занимать больше времени, чем второй, так как процессор должен будет подготовиться к его выполнению. Было бы лучше запустить обе петли несколько раз, прежде чем принимать меры и избегать использования IO, поскольку это значительно затрудняет точность измерения. Я сделал несколько изменений в вашем тесте, и мои результаты показали, что обе имеют одинаковую производительность, иногда один идет немного быстрее, в другое время, то есть: (класс: 1116, 530, 523, 507) (struct: 1087, 498, 541 , 543). – VinGarcia
Мой оригинальный код должен был это сделать, но я удалил его случайно, поэтому я просто написал быстрый и грязный код для публикации :) – ndrewxie
- 1. Маршаллинг массив структур с классами
- 2. Должны ли пользователи быть классами или массивами структур?
- 3. float с массивом структур?
- 4. Поделиться фрагментом с несколькими классами?
- 5. Вектор структур внутри вектора структур
- 6. Apache Spark: использование структур папок для сокращения времени выполнения анализов
- 7. Печать массива структур structs приводит к непредвиденной ошибке выполнения?
- 8. Неявное преобразование типа объекта между несвязанными классами во время выполнения
- 9. Переключения между двумя классами перечислений во время выполнения в Java
- 10. С массив структур указателей
- 11. Группировка структур с перечислениями
- 12. создание структур в с
- 13. таНос с участием структур
- 14. Создание массива структур в функции во время выполнения
- 15. PyQt с классами C++
- 16. Как работать с классами
- 17. D3js. Работа с классами
- 18. Работа с классами
- 19. Regex с div-классами
- 20. Вложенное наследование с классами
- 21. общие указатели с классами
- 22. Симулятор блэкджека с классами
- 23. проблема с расширяющимися классами
- 24. Интерфейс с конкретными классами
- 25. Многопоточность с классами
- 26. Словарь с классами?
- 27. Проблемы с классами
- 28. бинарное дерево с классами
- 29. Имея проблему с классами
- 30. Проблема с классами
Какую из ваших близнецов вы любите больше всего? –
На самом деле, я никогда не использовал расширенные возможности структур C++, я всегда использовал их как контейнер данных для общедоступных данных, как C struct. Когда мне нужны сложные функции, такие как наследование, полиморфизм и т. Д., Я предпочитаю использовать классы. Так что это не отношения любви и ненависти. – systemsfault