Как эффективно инициализировать изменчивую структуруC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как эффективно инициализировать изменчивую структуру

Сообщение 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;
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ile-struct
Ответить

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

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

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

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

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