Re: Члены класса и aliasing
От: andyp  
Дата: 02.05.20 20:58
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Небольшой пример.


  Код
Ш>
Ш>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() он опять предполагает отсутствие алиасинга и генерирует более оптимальный код.


Небольшой вопрос, если бы в примере копили в private член класса, посчитал бы компилятор, что на него внешний указатель алиасить не может? В теории вроде бы как должен.

PS Можно немного почитить и копить в int64_t
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.