Я недавно задал этот вопрос:
Использование этого указателя вызывает странную деоптизацию в горячей петле
Проблема заключалась в том, что я писал на массив типа 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
Как создать массив uint8_t, который не подрывает строгого псевдонима? ⇐ C++
Программы на C++. Форум разработчиков
1750115260
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;
}
}
};
Подробнее здесь: [url]https://stackoverflow.com/questions/26297571/how-to-create-an-uint8-t-array-that-does-not-undermine-strict-aliasing[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия