Безопасно ли через функцию перезаписывать переменные в union?
Пример кода:
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
);
Источник: Stack Overflow на русском