those abi topics are confusing, but isnt there some common standards
No. There is no common standard for how data is passed to or from functions. GCC and VC++ can choose to do it entirely differently. GCC can do it differently for Intel chips than it does for ARM chips.
If you don't want to read ABIs and just want to know if this is possible or how it's done or if it's done, _look at the compiler's output_.
Sample code:
struct Color {unsigned char a,r,g,b;};
Color make_color() { Color c; c.r = 1; c.g = 2; c.b = 3; c.a = 4; return c; }
x86-64 via GCC 4.9.0 at -03:
make_color():
mov eax, 50462980
ret
ARM via GCC 4.6 at -03:
make_color():
movs r3, #4
movs r0, #0
bfi r0, r3, #0, #8
movs r3, #1
bfi r0, r3, #8, #8
movs r3, #2
bfi r0, r3, #16, #8
movs r3, #3
sub sp, sp, #8
bfi r0, r3, #24, #8
add sp, sp, #8
bx lr
x86 via Visual C++ 2013 Nov13_CTP in Release:
00FE4790 push ebp
00FE4791 mov ebp,esp
00FE4793 push ecx
00FE4794 mov word ptr [ebp-3],201h
00FE479A mov byte ptr [ebp-1],3
00FE479E mov byte ptr [c],4
00FE47A2 mov eax,dword ptr [c]
00FE47A5 mov esp,ebp
00FE47A7 pop ebp
00FE47A8 ret
At least with ARM and x86_64 via GCC and x86 via VC++ small structs are indeed returned in single registers at least on these specific architectures with these specific compilers on these specifics platforms.
If you want more guarantees, you'll need to read the relevant ABI documents.