Передавать ли в метод указатель на Worker или хранить его как член класса
Invite pending
Давно беспокоил этот вопрос, потому что часто сложные классы приходится разделять на более мелкие
Давайте разберемся. Используем компилятор GCC 4.9 и утилиту Callgrind и оптимизациями копилятора для Профилировнаия.
Количество инструкций процессора
Видим, что в случае когда мы передаем указатель на Worker в функцию, то CPU тратится на 4 инструкции больше.
Однако, при чтобы инициализировать член класса Complex в конструкторе, CPU читает столько же или больше инструкций, к тому же мы тратим 4 или 8 байт на хранение указателя как член класса.
Разница почти не наблюдается, поэтому делайте как вам удобно, однако самый лучший вариант самим провести подобный тест.
class Service1
{
public:
void doWork(Complex* complex)
{
complex->doWork();
}
};
class ServiceN
{
public:
void doWork()
{
_complex->doWork();
}
private:
Complex* _complex
};
class Complex
{
...
private:
friend class Service1;
Service1 service1;
...
friend class Service2;
ServiceN servicen;
};
Давайте разберемся. Используем компилятор GCC 4.9 и утилиту Callgrind и оптимизациями копилятора для Профилировнаия.
#include <iostream>
using namespace std;
class Worker
{
public:
void work()
{
printf("work for love\n");
}
void freeWork()
{
printf("work for food\n");
}
};
static Worker worker;
void freeWork(Worker* worker)
{
for(int i = 0; i < 10000; ++i)
worker->freeWork();
}
void work()
{
for(int i = 0; i < 10000; ++i)
::worker.work();
}
int main()
{
Worker worker;
for(int i = 0; i < 100; ++i) { // дополнительный цикл, для исключения оптимизации
::freeWork(&worker);
::work();
}
return 0;
}
Результаты теста на скринах
Количество инструкций процессора
Видим, что в случае когда мы передаем указатель на Worker в функцию, то CPU тратится на 4 инструкции больше.
Однако, при чтобы инициализировать член класса Complex в конструкторе, CPU читает столько же или больше инструкций, к тому же мы тратим 4 или 8 байт на хранение указателя как член класса.
Вывод
Разница почти не наблюдается, поэтому делайте как вам удобно, однако самый лучший вариант самим провести подобный тест.