Нужно ли повысить производительность, переместив выделение памяти локально для функции-члена в свой класс? - PullRequest
0 голосов
/ 02 июня 2010

Предположим, у меня есть следующий класс C ++:

class Foo
{
  double bar(double sth);
};

double Foo::bar(double sth)
{
  double a,b,c,d,e,f
  a = b = c = d = e = f = 0;
  /* do stuff with a..f and sth */
}

Функция bar () будет вызываться миллионы раз в цикле. Очевидно, что каждый раз, когда он вызывается, переменные a..f должны быть распределены. Получу ли я какую-либо производительность, сделав переменные членами класса Foo и просто инициализировав их в точке входа функции? С другой стороны, значения a..f будут разыменовываться через this->, поэтому мне интересно, не является ли это возможным снижением производительности. Есть ли издержки на доступ к значению через указатель? Спасибо!

Ответы [ 3 ]

6 голосов
/ 02 июня 2010

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

Если вы чувствуете, что увеличение / уменьшение значения в регистре процессора может помочь, вы переходите к микрооптимизации. Они должны быть сделаны как последняя вещь перед отправкой и (как и все оптимизации) должны руководствоваться измерением , а не догадками.

3 голосов
/ 02 июня 2010

Доступ к выделенным в стеке переменным быстрее, чем к членам класса. Переменные стека разыменовываются с помощью указателя стека, без использования указателя класса. Добавляйте новых членов класса, только если это требуется алгоритмом программы. Инициализируйте переменные стека непосредственно в объявлении:

double a = 0.0, b = 0.0 ...

3 голосов
/ 02 июня 2010

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

double a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;

Это может быть или не быть значимым для двойников, но, безусловно, будет для пользовательских типов, таких как строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...