Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?

С во встроенных системах традиционно использует структуры для хранения структурированных данных.

Arduino предлагает C++, поэтому вместо этого мы можем использовать классы.

Допустим, у нас есть две разные структуры данных, которые можно считать очень похожими:

typedef struct 
{
    int valueOne;
    int valueTwo;
    int valueThree;
} value_t;

и:

class Value
{
    public:
        int valueOne;
        int valueTwo;
        int valueThree;
}

Что это изменит с точки зрения памяти?

Я по-прежнему вижу, что метод структур активно используется. Почему?

, 👍22

Обсуждение

если я правильно помню свой С++, нет никакой разницы между struct и class, кроме видимости по умолчанию, @ratchet freak

Я бы предположил, что `структуры используются прежде всего потому, что **подавляющее** большинство встроенного оборудования закодировано на C, поэтому любой, кто тратит много времени на написание кода для небольших микроконтроллеров, вероятно, знает C намного лучше, чем C++, и автоматически достигает для идиом C перед идиомами C++. Это проблема производительности *программиста*., @Connor Wolf


5 ответов


Лучший ответ:

18

Согласно принятому ответу из Когда следует использовать класс, а не структуру в C++?

Единственная разница между классом и структурой в C++ заключается в том, что структуры имеют открытые члены по умолчанию, а базы и классы имеют значения по умолчанию. частные члены и базы. И классы, и структуры могут иметь смесь открытых и закрытых членов, может использовать наследование и может иметь функции-члены.

Я бы рекомендовал использовать структуры как обычные структуры данных без любые классоподобные функции и использование классов в качестве агрегированных данных структуры с закрытыми данными и функциями-членами.

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

,

10

В отличие от C, экземпляр struct в C++ является объектом точно так же, как экземпляр класса. С точки зрения скомпилированного кода они идентичны. Использование памяти, выравнивание, время доступа и т. д. точно такие же (т. е. отсутствуют накладные расходы).

С точки зрения программиста разница очень незначительна. Члены struct по умолчанию имеют общедоступную видимость, тогда как члены class по умолчанию имеют частную видимость. В остальном все функции языка работают одинаково на обоих, например конструкторы/деструкторы, наследование, полиморфизм, шаблоны и перегрузка операторов. Вы даже можете получить struct от class и наоборот.

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

,

4

Как указывалось в других ответах, ваш конкретный struct и class неразличимы с точки зрения производительности (существуют небольшие различия в областях имен типов из-за способа вы определили свою структуру). Разграничение в C++ проводится не между struct и class, а между типами, которые являются POD (обычными старыми данными), и типами, которые таковыми не являются, как объясняется в этом обсуждении.

,

2

Обратите внимание

typedef struct { ... } Foo;

устарело в C++, и вам следует просто использовать

struct Foo { ... };

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

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

Кроме того, технически "структура против объекта" должна быть "структура против класса" (поскольку создание экземпляра структуры или класса по-прежнему дает объект).

,

Отредактированный объект вопроса-> класс., @Cybergibbons


3

Что это изменит с точки зрения памяти?

Нет. Структуры и классы — это одно и то же, различающиеся только уровнями защиты, и создание экземпляра любого из них создает «объект».

по-прежнему наблюдается интенсивное использование техники структур. Почему?

Меньше ввода, если вы не пытаетесь скрыть элементы данных.

,