2017-02-04 14 views
-2

Рассмотрим такой сценарий:Мгновенная альтернатива локальной переменной с геттером?

class Test { 
public: 
    Test() : _var{5} {} 
    inline int getVar() { 
     return _var; 
    } 
private: 
    int _var; 
} 

void func(Test& t) { 
    int var = t.getVar(); 
    int a = 1 + var; 
    int b = 2 + var; 
    ... 
    int z = 26 + var; 
} 

int main() { 
    Test t; 
    for (int i = 0; i < 1000000; ++i) { 
     func(t); 
    } 
} 

Хотя профилирование аналогичное исполнение в течение ~ 40-х годов, я увидел, что GETVAR() вызов в одиночку мне стоит около 0.8s, который кажется огромным только за доступ к Int.

Однако, установив мой _var как открытый и доступ к нему напрямую (t._var) вместо использования локальной переменной и тестового getter, он еще медленнее.

Есть ли волшебное решение C++, которое почти мгновенно доступно для доступа к «_var»?

+6

Простая магия - попросить вашего компилятора оптимизировать. –

+2

Как вы измерили? Какой уровень оптимизации компилятора использовался тогда? –

+0

Кэширование значения в локальной переменной происходит так же быстро, как это будет сделано, поскольку это позволяет компилятору сохранять значение в регистре, а не извлекать его из памяти каждый раз. – molbdnilo

ответ

-1

Методы, определенные в определении класса, всегда inline. Обратите внимание, что inline не обязательно означает, что вызовы этого метода заменяются телом метода, имеют look.

Скорее всего, ваше измерение времени ошибочно, или вы не включили оптимизацию, и компилятор не смог оптимизировать ад.

+0

Это неправда, они всегда выложены. Inline - это подсказка. Компилятор может игнорировать его –

+1

_inline_ означает, что определение функции «может появляться более одного раза в программе». Он потерял первоначальное намерение _inlining_ тела функции. –

 Смежные вопросы

  • Нет связанных вопросов^_^