Сишные трюки от мыщъха


пример с лишними обращениями к памяти, от которых можно избавиться вручную


Компилятор не может поместить переменную dst в регистр, поскольку если ячейки *x и *dst частично или полностью перекрываются, модификация ячейки *dst приводит к неожиданному изменению *x! Бред, конечно, но Стандарт таких трюков не запрещает, а оптимизатор не имеет права отступать от Стандарта, поэтому обращения к памяти происходят на _каждой_ итерации, а это весьма "дорогостоящая" в плане процессорных тактов операция!

Переписанный код выглядит так:

f(char *x, int *dst, int n)

{

       int i,t =0;

       for

(i=0;i<n;i++) t+=x[i]; // сохранение суммы во временной переменной

       *dst+=t;                   // запись конечного результата в память

}



Содержание раздела