Члены класса и aliasing
От: Шахтер Интернет  
Дата: 02.05.20 10:07
Оценка: 27 (5)
Небольшой пример.

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) Локальные переменные лучше членов класса.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.