Безопасно ли через функцию перезаписывать переменные в union?

Рейтинг: 0Ответов: 0Опубликовано: 12.06.2023

Пример кода:

    union
    {
        struct
        {
            bool is_small;
            u1 status;
            u1 arr[29];
            u1 a; // 1 байт
            u4 b; // 4 байта
            u4 c;
        } small_t;

        struct
        {
            bool is_small;
            u1 status;
            u1 * mem_ptr;
            u8 a; // 8 байт
            u8 b;
            u8 c;
        } big_t;
    };

И функция-метод записывающая данные в нужный вариант

    void Set( u8 a, u8 b, u8 c)
    {
        if ( a <= 29 )
        {
            small_t.is_small = true;
            small_t.a = a;
            small_t.b = b;
            small_t.c = c;
        } else {
            big_t.is_small = false;
            big_t.a = a;
            big_t.b = b;
            big_t.c = c;
        }
    }

Вопрос: Гарантирует ли стандарт, что вызванная выше функция с аргументами, полученных из union, даст им корректное временное расположение в стеке, а не испортит данные при чтении-записи в их альтернативную часть union.

Пример вызова:

if( XX.small_t . is_small == true ) 
     XX . Set( XX.small_t . a + 9'999'999'999'999, 
               XX.small_t . b , 
               XX.small_t . c 
             );
// ======= Потенциальный inline до состояния ?? =======
// big_t . a = small_t . a + 9'999'999'999'999;
// big_t . b = small_t . b;
// big_t . c = small_t . c; // И тогда чеши пропало

Дополнение/Уточнение:

Будет ли код вызова функции выше равноценен коду ниже по стандарту ?:

auto a = XX.small_t . a; // Принудительно сохраняем 
auto b = XX.small_t . b; // значения в стек и используем
auto c = XX.small_t . c; // 

if( XX.small_t . is_small == true ) 
     XX . Set( a + 9'999'999'999'999, 
               b, 
               c
             );

Ответы

Ответов пока нет.