Повторяется ли код в классе для каждого экземпляра?
Раньше мне не нужны были курсы по программированию для Arduino, но теперь у меня есть хороший вариант использования. Однако я не уверен, что понимаю, как это повлияет на пространство кода.
В настоящее время у меня есть структура, содержащая свойства объекта, и общий код, который перебирает массив из 12 элементов этой структуры. Он довольно компактный.
Было бы чище обернуть операции над структурой в класс и работать с массивом из 12 элементов этого класса. По сути, текущая структура станет личными данными класса.
Будет ли весь код класса повторяться в каждом экземпляре или компилятор достаточно умен, чтобы избежать такого повторения?
Любые разъяснения приветствуются. C++ не является моим основным языком.
@Jim Mack, 👍0
2 ответа
Лучший ответ:
Нет, не повторяется. Если вы не используете шаблоны, каждый метод каждый класс сохраняется в скомпилированной программе только один раз. Или даже нет сохраняется вообще, если оптимизатор заметит, что он не используется.
Чтобы немного демистифицировать классы, вы можете рассматривать их как своего рода «синтаксический сахар» вместо «объектно-ориентированного» шаблона программирования. следующий код C++:
class MyClass {
public:
int aMember;
long anotherMember;
int aMethod(short);
};
int MyClass::aMethod(short theParameter)
{
return aMember + theParameter;
}
void some_function()
{
MyClass objects[2];
objects[1].aMethod(42);
}
интерпретируется компилятором как примерно эквивалентный этому C код:
typedef struct {
int aMember;
long anotherMember;
} MyClass;
int MyClass_aMethod(MyClass *this, short theParameter)
{
return this->aMember + theParameter;
}
void some_function()
{
MyClass objects[2];
MyClass_aMethod(&objects[1], 42);
}
Можете ли вы найти различия и сходства?
Нет, код не повторяется для каждого экземпляра. Методы экземпляра подобны функциям. Существует только одна копия кода.
Существует таблица диспетчеризации, которая сопоставляет вызовы методов с их реализациями. (На самом деле это стандартный C++. Я точно не знаю, как он реализован в компиляторе Arduino C++)
Таблица диспетчеризации используется только для виртуальных методов. Пока мы говорим о невиртуальных методах, все работает именно так, как описал @Edgar Bonet. Нет необходимости в каких-либо таблицах. Компилятор Arduino IDE C++ — это компилятор C++11 с расширениями GNU., @AnT
Важное различие в отношении виртуальных методов. Спасибо, что указали на это., @Duncan C
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Инициализация массива структур
- Отправить структуру через Serial
- Передавать данные структуры во внешнюю структуру через serial?
- Массив динамического размера в качестве члена класса
- Как получить размер (sizeof) массива структур
- Структура typedef не работает
Я понял идею, но не уверен, как интерпретировать
return aMember + theParameter;
В любом случае, на главный вопрос дан ответ, так что спасибо., @Jim Mack@JimMack: Внутри метода класс используется как своего рода пространство имен. Таким образом, компилятор знает, что
aMember
на самом деле означаетthis->aMember
., @Edgar Bonet