Как создать массив uint8_t, который не подрывает строгого псевдонима?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как создать массив uint8_t, который не подрывает строгого псевдонима?

Сообщение Anonymous »

Я недавно задал этот вопрос:

Использование этого указателя вызывает странную деоптизацию в горячей петле

Проблема заключалась в том, что я писал на массив типа uint8_t , а компилятор относился к нему как если бы он мог с алиасом с этим (как метод>, кодовой конструкции, «код», «код», потому что это может быть алиасом с помощью «кода>», потому что это может быть алиасом с помощью «кода>». void* и char* (=uint8_t*) всегда может быть псевдоним любого другого указателя в C ++. Такое поведение вызвало упущенную возможность оптимизации. Я хочу избежать этого, конечно. Итак, вопрос: могу ли я объявить массив uint8_t , который обеспечивает строгие псевдонимы, то есть компилятор рассматривает как никогда не подсчитанное с каким -либо указателем другого типа? То есть, я ищу что -то вроде типа strict_uint8_t , который является Uint8_t с специальным поведением в области псевдонима. Есть ли способ достичь этого? Для получения более подробной информации прочитайте связанный вопрос и его принятый ответ: < /p>

struct T{
uint8_t* target;
void unpack3bit(char* source, int size) {
while(size > 0){
uint64_t t = *reinterpret_cast(source);
/** `this->target` cannot be cached in a register here but has
to be reloaded 16 times because the compiler
thinks that `this->target` could alias with `this` itself.
What I want is a special uint8_t type that does not trigger
this behaviour. */
this->target[0] = t & 0x7;
this->target[1] = (t >> 3) & 0x7;
this->target[2] = (t >> 6) & 0x7;
this->target[3] = (t >> 9) & 0x7;
this->target[4] = (t >> 12) & 0x7;
this->target[5] = (t >> 15) & 0x7;
this->target[6] = (t >> 18) & 0x7;
this->target[7] = (t >> 21) & 0x7;
this->target[8] = (t >> 24) & 0x7;
this->target[9] = (t >> 27) & 0x7;
this->target[10] = (t >> 30) & 0x7;
this->target[11] = (t >> 33) & 0x7;
this->target[12] = (t >> 36) & 0x7;
this->target[13] = (t >> 39) & 0x7;
this->target[14] = (t >> 42) & 0x7;
this->target[15] = (t >> 45) & 0x7;
source+=6;
size-=6;
target+=16;
}
}
};


Подробнее здесь: https://stackoverflow.com/questions/262 ... t-aliasing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»