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

17

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

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

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

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

и:

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

С точки зрения памяти, что это изменит?

Я до сих пор вижу интенсивное использование техники struct - почему это так?

Cybergibbons
источник
5
если я помню мои C ++ правильно нет никакой разницы между structи к classтому же по умолчанию видимости в
храповым урод
4
Я бы предположил, что structs используются главным образом потому, что подавляющее большинство встроенного оборудования написано на C, поэтому любой, кто тратит много времени на написание кода для небольших MCU, вероятно, знает C гораздо лучше, чем C ++, и автоматически достигает идиом C перед идиомами C ++. Это проблема производительности программиста .
Коннор Вольф

Ответы:

13

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

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

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

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

чокнутый урод
источник
6

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

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

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

Питер Блумфилд
источник
4

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

microtherion
источник
3

С точки зрения памяти, что это изменит?

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

все еще видите, как активно используется техника struct - почему это так?

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

грязевой
источник
2

Обратите внимание, что

typedef struct { ... } Foo;

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

struct Foo { ... };

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

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

Также технически «структура против объекта» должна быть «структура против класса» (так как создание экземпляра структуры или класса все еще дает объект).

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