Геттер, сеттер в ООП

Недавно начал знакомиться с ООП. По-скольку хоть мало-мальски понимаю как работают инструкции в ASM, то резонный вопрос. Не медленнее-ли. Нет, даже не так. Не больше ли инструкций в ASM исполняется при использовании в ООП сеттеров и геттеров, нежели прямой установки значений через поле? На сколько это сказывается на общей производительности в рантайме?


Ответы (2 шт):

Автор решения: LShadow77

Если сеттеры и геттеры объявлять как inline, то это будет равносильно прямым присвоениям или чтениям значений в/из полей класса. Так, собственно, делать и нужно. Но тут надо учитывать особенности конкретного компилятора. Например, я лично обнаружил, что компилятор MinGW GCC далеко не всегда делает объявленные внутри класса функции встроенными. Более того, даже объявление ключевого слова inline не гарантирует, что эти функции будут на самом деле inline. Чтобы это гарантировать, в GCC приходится применять конструкцию inline attribute((always_inline)), которую удобно объявить в виде макроса. Например:

//макрос, гарантирующий, что функция будет встроенной
#ifdef __GNUC__
#define INLINE inline __attribute__((always_inline))
#else
#define INLINE inline
#endif

//некоторый класс
class CSomeClass
{
    int m_val;

public:
    INLINE CSomeClass(int val) {m_val = val;}
    INLINE SetVal(int val) {m_val = val;}
    INLINE int GetVal() {return m_val;}
};

//некоторый код, использующий данный класс
....
CSomeClass cls(0);
cls.SetVal(7);
printf("m_val==%d\n",cls.GetVal());
....
→ Ссылка
Автор решения: Alex Guteniev

Не там оверхед ООП. Геттеры/сеттеры прекрасно встраиваются, если надо.

С++ ООП отрицательно влияет на производительность, когда влияет на структуры данных, в частности:

  • Требует использования массива структур вместо структуры массивов
  • Требует косвенность для полиморфизма
→ Ссылка