Здравствуйте, Шахтер, Вы писали:
Ш>Небольшой пример.
| Код |
| Ш>Ш>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