Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
С во встроенных системах традиционно использует структуры для хранения структурированных данных.
Arduino предлагает C++, поэтому вместо этого мы можем использовать классы.
Допустим, у нас есть две разные структуры данных, которые можно считать очень похожими:
typedef struct
{
int valueOne;
int valueTwo;
int valueThree;
} value_t;
и:
class Value
{
public:
int valueOne;
int valueTwo;
int valueThree;
}
Что это изменит с точки зрения памяти?
Я по-прежнему вижу, что метод структур активно используется. Почему?
@Cybergibbons, 👍22
Обсуждение5 ответов
Лучший ответ:
Согласно принятому ответу из Когда следует использовать класс, а не структуру в C++?
Единственная разница между классом и структурой в C++ заключается в том, что структуры имеют открытые члены по умолчанию, а базы и классы имеют значения по умолчанию. частные члены и базы. И классы, и структуры могут иметь смесь открытых и закрытых членов, может использовать наследование и может иметь функции-члены.
Я бы рекомендовал использовать структуры как обычные структуры данных без любые классоподобные функции и использование классов в качестве агрегированных данных структуры с закрытыми данными и функциями-членами.
С точки зрения памяти модификатор доступа не имеет значения, и, учитывая ограничения памяти Arduino, люди с меньшей вероятностью будут использовать классы со сложной иерархией, но в любом случае предпочитают структуры POD.
В отличие от C, экземпляр struct
в C++ является объектом точно так же, как экземпляр класса
. С точки зрения скомпилированного кода они идентичны. Использование памяти, выравнивание, время доступа и т. д. точно такие же (т. е. отсутствуют накладные расходы).
С точки зрения программиста разница очень незначительна. Члены struct
по умолчанию имеют общедоступную видимость, тогда как члены class
по умолчанию имеют частную видимость. В остальном все функции языка работают одинаково на обоих, например конструкторы/деструкторы, наследование, полиморфизм, шаблоны и перегрузка операторов. Вы даже можете получить struct
от class
и наоборот.
Несмотря на сходство, довольно часто можно увидеть, как люди преднамеренно используют struct
в C++ для очень простых структур, например, когда они состоят только из нескольких элементов данных, но не функций. Для чего-то более сложного можно использовать класс
. Однако это исключительно вопрос соглашения или личных предпочтений, и его можно использовать как тонкое указание на предполагаемую сложность структуры.
Как указывалось в других ответах, ваш конкретный struct
и class
неразличимы с точки зрения производительности (существуют небольшие различия в областях имен типов из-за способа вы определили свою структуру). Разграничение в C++ проводится не между struct
и class
, а между типами, которые являются POD (обычными старыми данными), и типами, которые таковыми не являются, как объясняется в этом обсуждении.
Обратите внимание
typedef struct { ... } Foo;
устарело в C++, и вам следует просто использовать
struct Foo { ... };
В ответах не очень ясно, но другим эффектом структур является публичное наследование по умолчанию по сравнению с частным наследованием по умолчанию с классами.
Как упоминалось другими, использование struct обычно является соглашением для типов POD.
Кроме того, технически "структура против объекта" должна быть "структура против класса" (поскольку создание экземпляра структуры или класса по-прежнему дает объект).
Отредактированный объект вопроса-> класс., @Cybergibbons
Что это изменит с точки зрения памяти?
Нет. Структуры и классы — это одно и то же, различающиеся только уровнями защиты, и создание экземпляра любого из них создает «объект».
по-прежнему наблюдается интенсивное использование техники структур. Почему?
Меньше ввода, если вы не пытаетесь скрыть элементы данных.
- Прерывания внутри класса, связанные с функцией класса
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
если я правильно помню свой С++, нет никакой разницы между
struct
иclass
, кроме видимости по умолчанию, @ratchet freakЯ бы предположил, что `структуры используются прежде всего потому, что **подавляющее** большинство встроенного оборудования закодировано на C, поэтому любой, кто тратит много времени на написание кода для небольших микроконтроллеров, вероятно, знает C намного лучше, чем C++, и автоматически достигает для идиом C перед идиомами C++. Это проблема производительности *программиста*., @Connor Wolf