Я хотел бы использовать битовые поля для доступа к памяти низкого уровня. Я знаю о непереносимости битовых полей, но, похоже, они последовательно реализованы на моей платформе (cortex-m4) как в clang, так и в gcc. Однако я обнаружил, что присвоение всего битового поля одновременно генерирует значительно больше инструкций ассемблера для clang, чем для gcc. Упрощенный пример моей цели показан ниже:
struct B {
struct {
volatile int b:3;
volatile int c:3;
volatile int d:26;
} a;
} bmem;
constexpr B * const b = &bmem;
void fun() {
b->a = { .b = 1, .c = 2 };
}
Ссылка на исследование компилятора
При переключении между Armv7-a Clang 21.1.0 и Arm GCC 15.2.0 можно увидеть, что компилятор GCC оптимизирует инициализацию структуры до 3 инструкций, в то время как Clang принимает 16. Похоже, что clang обрабатывает значения rhs как изменчивые, а gcc - нет. Я пробовал различные варианты, чтобы сократить количество инструкций, генерируемых clang, но не смог найти надежного способа заставить это работать. Самое близкое, что я мог бы сделать без большого количества дополнительного кода, — это пометить указатель структуры b как указатель на изменчивую, а не на члены структуры B. А затем сделать это объединением и использовать незаконный (из-за неопределенного поведения) каламбур типа объединения. Однако мне не нравится это решение. Есть ли простой способ указать компилятору, что я хотел бы установить это значение памяти, не рассматривая значение инициализации как изменчивое?
Вот версия каламбура типа объединения:
struct B {
union {
int u;
struct {
int b:3;
int c:3;
int d:26;
} a;
};
} bmem;
constexpr volatile B * const b = &bmem;
void fun() {
b->u = B { .a = { .b = 1, .c = 2 } }.u;
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ile-struct
Как эффективно инициализировать изменчивую структуру ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1762839587
Anonymous
Я хотел бы использовать битовые поля для доступа к памяти низкого уровня. Я знаю о непереносимости битовых полей, но, похоже, они последовательно реализованы на моей платформе (cortex-m4) как в clang, так и в gcc. Однако я обнаружил, что присвоение всего битового поля одновременно генерирует значительно больше инструкций ассемблера для clang, чем для gcc. Упрощенный пример моей цели показан ниже:
struct B {
struct {
volatile int b:3;
volatile int c:3;
volatile int d:26;
} a;
} bmem;
constexpr B * const b = &bmem;
void fun() {
b->a = { .b = 1, .c = 2 };
}
Ссылка на исследование компилятора
При переключении между Armv7-a Clang 21.1.0 и Arm GCC 15.2.0 можно увидеть, что компилятор GCC оптимизирует инициализацию структуры до 3 инструкций, в то время как Clang принимает 16. Похоже, что clang обрабатывает значения rhs как изменчивые, а gcc - нет. Я пробовал различные варианты, чтобы сократить количество инструкций, генерируемых clang, но не смог найти надежного способа заставить это работать. Самое близкое, что я мог бы сделать без большого количества дополнительного кода, — это пометить указатель структуры b как указатель на изменчивую, а не на члены структуры B. А затем сделать это объединением и использовать незаконный (из-за неопределенного поведения) каламбур типа объединения. Однако мне не нравится это решение. Есть ли простой способ указать компилятору, что я хотел бы установить это значение памяти, не рассматривая значение инициализации как изменчивое?
Вот версия каламбура типа объединения:
struct B {
union {
int u;
struct {
int b:3;
int c:3;
int d:26;
} a;
};
} bmem;
constexpr volatile B * const b = &bmem;
void fun() {
b->u = B { .a = { .b = 1, .c = 2 } }.u;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79816058/how-to-efficiently-initialize-a-volatile-struct[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия