Небольшой пример.
struct Count
{
int val;
explicit Count(PtrLen<const int> r) CCORE_NOINLINE // no aliasing
{
val=0;
for(int v : r ) val+=v;
}
void sum(PtrLen<const int> r) CCORE_NOINLINE // possible aliasing with val
{
val=0;
for(int v : r ) val+=v;
}
};
int Sum(PtrLen<const int> r) // no aliasing
{
int val=0;
for(int v : r ) val+=v;
return val;
}
Здесь GCC при генерации кода делает предположения о возможном алиасинге данных.
В конструкторе он предполагает отсутствие такового. Поэтому он хорошо раскручивает код с использованием SIMD инструкций.
В методе sum() он предполагает возможность алиасинга. Поэтому код получается менее оптимальным.
В функции Sum() он опять предполагает отсутствие алиасинга и генерирует более оптимальный код.
Мораль.
1) Следите за алиасингом при программировании на скорость.
2) Локальные переменные лучше членов класса.