Использование const & amp; тип для переменных перемаркировки

Я люблю использовать const& type T = LongVariableName чтобы связать переменные в коротком сегменте кода, особенно с формулой.

Например:

const double& x = VectorNorm;
double y = a*x*x*x + b*x*x + c*x + d;

Я считаю, что компилятор должен быть достаточно умен, чтобы оптимизировать эти ссылочные переменные. Это почти всегда случается? Когда не будет?

1

Решение

Это зависит от компилятора и опций оптимизации, которые вы установили — нет никакой гарантии, что он будет или не будет оптимизирован. Современные компиляторы с включенными оптимизациями, скорее всего, оптимизируют его, но лучше задать вопрос: вас это волнует? Если вы не находитесь в крутом цикле, работающем тысячи раз в секунду, не беспокойтесь об этом. Четкость кода часто важнее, чем сокращение нескольких тактов.

Но, во всяком случае, давайте посмотрим. Я использую gcc 4.7.2 через MinGW. Мы будем использовать этот код:

so.cpp:

#include <cstdio>

int main()
{
float aReallyLongNameForAVariable = 4.2;
#ifdef SHORT_REF
const float& x = aReallyLongNameForAVariable;
float bar = x * x * x;
#else
float bar = aReallyLongNameForAVariable * aReallyLongNameForAVariable * aReallyLongNameForAVariable;
#endif
printf("bar is %f\n", bar);
return 0;
}

Без «краткой ссылки» мы получаем следующую сборку:

g++ -S -masm=intel -o noref.S so.cpp

call    ___main
mov eax, DWORD PTR LC0
mov DWORD PTR [esp+28], eax
fld DWORD PTR [esp+28]
fmul    DWORD PTR [esp+28]
fmul    DWORD PTR [esp+28]
fstp    DWORD PTR [esp+24]
fld DWORD PTR [esp+24]
fstp    QWORD PTR [esp+4]
mov DWORD PTR [esp], OFFSET FLAT:LC1
call    _printf
mov eax, 0
leave

Теперь давайте воспользуемся ссылкой:

g++ -DSHORT_REF -S -masm=intel -o ref.S so.cpp

call    ___main
mov eax, DWORD PTR LC0
mov DWORD PTR [esp+20], eax
lea eax, [esp+20]
mov DWORD PTR [esp+28], eax
mov eax, DWORD PTR [esp+28]
fld DWORD PTR [eax]
mov eax, DWORD PTR [esp+28]
fld DWORD PTR [eax]
fmulp   st(1), st
mov eax, DWORD PTR [esp+28]
fld DWORD PTR [eax]
fmulp   st(1), st
fstp    DWORD PTR [esp+24]
fld DWORD PTR [esp+24]
fstp    QWORD PTR [esp+4]
mov DWORD PTR [esp], OFFSET FLAT:LC1
call    _printf
mov eax, 0
leave

Так что это немного больше сборки. Но что происходит, когда мы включаем оптимизацию?

g++ -DSHORT_REF -O2 -S -masm=intel -o ref.S so.cpp
g++ -O2 -S -masm=intel -o noref.S so.cpp

Оба генерируют одинаковую сборку:

call    ___main
fld DWORD PTR LC0
fstp    QWORD PTR [esp+4]
mov DWORD PTR [esp], OFFSET FLAT:LC1
call    _printf
xor eax, eax
leave

Так что у вас есть это. Современные компиляторы (по крайней мере, gcc) оптимизируют ссылки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]