Які накладні витрати та інші міркування існують при використанні struct vs класу?


17

C у вбудованих системах традиційно використовує структури для зберігання структурованих даних.

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

Скажімо, у нас є дві різні структури даних, які можна вважати дуже схожими:

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

і:

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

Що стосується пам’яті, яка різниця це спричинить?

Я все ще бачу техніку структури, яка активно використовується - чому це?


5
якщо я пам'ятаю мої C ++ правильно немає ніякої різниці між structі до classтого ж по замовчуванням видимості в
храповим урод

4
Я б припустив , structs використовується в першу чергу тому , що велика більшість вбудованих апаратних засобів кодуються в C, так що будь-який , хто проводить багато часу написання коду для малого мікроконтролери , ймовірно , знає C набагато краще , ніж C ++, і автоматично досягає для ідіоми C до ідіоми C ++. Це питання продуктивності програміста .
Коннор Вольф

Відповіді:


13

Як випливає із прийнятої відповіді, коли ви повинні використовувати клас проти структуру в C ++?

Єдина відмінність класу та структури в C ++ полягає в тому, що структури мають загальнодоступні члени, а бази, а класи мають приватні члени та бази за замовчуванням. І класи, і структури можуть мати суміш публічних і приватних членів, можуть користуватися успадкуванням і можуть мати функції членів.

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

Пам'ять, що модифікатор доступу не має жодних значень і враховуючи обмеження пам'яті Arduino, люди рідше використовують класи зі складними ієрархіями, але в будь-якому випадку віддають перевагу структурам POD.


6

На відміну від C, екземпляр structв C ++ є об'єктом точно так само, як і екземпляр a class. З точки зору складеного коду вони ідентичні. Використання пам'яті, вирівнювання, час доступу тощо точно такі ж (тобто немає накладних витрат).

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

Незважаючи на подібність, досить часто бачити людей, які навмисно використовують structC в + для дуже простих структур, наприклад, там, де він складається лише з кількох членів даних, але немає функцій. A classбуде використовуватися для чогось більш складного. Це суто питання конвенції або особистих уподобань і може бути використане як тонке вказівка ​​наміченої складності структури.


4

Як вказували інші відповіді, ваш конкретний характер structі classне відрізняється від продуктивності (Існують невеликі відмінності в обсягах назв типів, внаслідок того, як ви визначили структуру). Розмежування в C ++ не між structі class, але між типами, які POD (звичайний старий даних) і типи, які не є, як пояснено в цьому обговоренні .


3

Що стосується пам’яті, яка різниця це спричинить?

Жоден. Структури та класи - це одне і те ж, що відрізняються лише рівнями захисту, а інстанція створює «об’єкт».

все ще бачимо, що техніка структури дуже активно використовується - чому це?

Менше набирайте текст, якщо ви не намагаєтесь приховати учасників даних.


2

Зауважте, що

typedef struct { ... } Foo;

застарілий у C ++, і вам слід просто скористатися

struct Foo { ... };

У відповідях це не дуже зрозуміло, але іншим ефектом структур є публічне успадкування за замовчуванням проти приватного успадкування за замовчуванням з класами.

Як зазначають інші, використання структури - це звичайно умова для типів POD.

Технічно також "структура проти об'єкта" повинна бути "структура проти класу" (оскільки екземпляр структури або класу все ще дає об'єкт).


Відредагований питання питання-> клас.
Кібергібони
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.