Всем привет
Правильно ли я понимаю, что, если в классе есть член uint8_t * или int8_t * (char), например, указатель на начало массива, и в теле метода присутствуют разыменования данного члена и дальнейшие присваивания (а возможно даже и цикл присваиваний), то для того, чтобы компилятор мог применить оптимизацию, нужно закешировать член класса в локальную переменную ?
Ссылка на обсуждение похожей темы
То есть вместо:
uint8_t * buffer; // Член класса/структуры
buffer[0] = value1;
buffer[1] = value2;
buffer[2] = value3;
...
buffer[n] = valueN;
Писать:
uint8_t * _buffer = buffer;
_buffer[0] = value1;
_buffer[1] = value2;
_buffer[2] = value3;
...
_buffer[n] = valueN;
И второй вопрос: можно ли вместо того, чтобы делать локальную копию этой переменной, просто добавить в сигнатуру метода
__restrict,
гарантировав, что this не изменится в теле метода ? Потому как, если я правильно понял, согласно 1-му ответу
здесь
In that case, writing to this->target[0] would alter the contents of this (and thus, this->target).
может поменять константный в соответствии с сигнатурой метода
__restrict указатель this ?
P.S.:
- Замерял скорость работы этого участка кода с -O3 - при небольшом количестве присваиваний скорость отличается на 10-15%, а если присваивания происходят, например, в цикле с количеством итераций 10_000+, то скорость отличается в 2 раза
- Ну и если заменить uint8_t *, например, на uint16_t *, то версия с кэшированием переменной не даёт никакого прироста производительности