Как компилятор C проходит и возвращает struct/union в/из функции? Является ли структура нажатой в стек перед вызовом функции, это только ссылка структуры, которая передается функции?Передача структуры/объединения функции в C
Тот же вопрос касается возврата. Что точно возвращает функция?
typedef struct {
long m4;
long m3;
long m2;
long m1;
} ext_components_t;
typedef union {
long array[sizeof(int_components_t)];
int_components_t comp;
} int_components_u;
typedef union {
long array[sizeof(ext_components_t)];
ext_components_t comp;
} ext_components_u;
#pragma never_inline
ext_components_u transfer(int_components_u m)
{
ext_components_u out;
out.comp.m1 = 10*m.comp.a+11*m.comp.b+12*m.comp.c;
out.comp.m2 = 20*m.comp.a+21*m.comp.b+22*m.comp.c;
out.comp.m3 = 30*m.comp.a+31*m.comp.b+32*m.comp.c;
out.comp.m4 = 40*m.comp.a+41*m.comp.b+42*m.comp.c;
return out;
}
volatile int_components_u x;
volatile ext_components_u y;
void main()
{
y = transfer(x);
}
Вот мое предположение (псевдо-код):
push_stack(x.array[0])
push_stack(x.array[1])
push_stack(x.array[2])
call transfer
y.array[0] = shift_stack()
y.array[1] = shift_stack()
y.array[2] = shift_stack()
y.array[3] = shift_stack()
Или другое решение может быть:
call transfer(&x)
y.array[0] = shift_stack()
y.array[1] = shift_stack()
y.array[2] = shift_stack()
y.array[3] = shift_stack()
Это зависит от реализации. Обычно реализация будет следовать за платформой ABI. –