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

С++: Когда следует использовать структуры вместо классов и где есть различия в скорости?

  • Когда следует использовать struct вместо класса? В настоящее время я использую классы для всего, от оберток текстур OpenGL до растровых шрифтов.

  • Являюсь классом, который я использую так же, как struct (не применяя наследование, полиморфизм и т.д.) еще медленнее, чем struct?

4b9b3361

Ответ 1

Структуры и классы в С++, как вы знаете, отличаются только уровнем доступа по умолчанию (и доступностью по умолчанию для их баз: public для struct, private для класса).

Некоторые разработчики, включая меня, предпочитают использовать структуры для POD-типов, то есть с C-образными структурами, без виртуальных функций, баз и т.д. Структуры должны не имеют поведения - это всего лишь компромисс данных, помещенных в один объект.

Но это, естественно, вопрос стиля и, очевидно, не медленнее

Ответ 2

1) Нет никакой реальной разницы между двумя другими, кроме того факта, что члены структуры по умолчанию являются общедоступными, если классы являются закрытыми.

2) Нет, это ТОЧНО то же самое.

Изменить: помните, что вы можете использовать виртуальное наследование с помощью структур. Они ТАКИЕ:)

Ответ 3

Вместо того, чтобы дешевле и ссылаться на другие вопросы, я буду повторять то, что говорили другие, прежде чем добавлять к ним.

struct и class идентичны в С++, единственным исключением является то, что struct имеет доступ по умолчанию к public, а class имеет доступ по умолчанию для частного доступа. Поддержка производительности и языка идентична.

Идиоматически, однако, struct в основном используется для "немых" классов (plain-old-data). class используется больше для воплощения истинного класса.

Кроме того, я также использовал struct для локально определенных объектов функции, таких как:

struct something
{
    something() : count(0) { }
    void operator()(int value) { std::cout << value << "-" << count++ << "\n"; }
    int count;
} doSomething;

std::vector<int> values;

...

std::foreach(values.begin(); values.end(); doSomething);

Ответ 4

как объяснили другие, это одно и то же, за исключением уровней доступа по умолчанию.

единственная причина, по которой занятия могут восприниматься медленнее, - это то, что хороший стиль (но не единственный) - это тот, который упоминается АрменТсирунян: struct для типов POD, class для полнофункциональных классов объектов. Последние обычно включают наследование и виртуальные методы, поэтому vtables, которые немного медленнее, чем прямые функции.

Ответ 5

Мне нравится использовать классы, когда мне нужно иметь явный деструктор. Потому что тогда вы должны следовать правилу три, и в этом случае вам нужно написать конструктор копий и перегрузщик назначений. При этом более естественно использовать класс, чем структуру.