Visual c++ 2008 64 bit seems to pass the structure by having the caller allocate space for a copy of the structure on it's stack and copying the data items into it and then passing just the address of that copy into the function by value.
This simple example compiled as follows -
struct data {
int a;
int b;
int c;
char d;
float f;
};
double f2(data d)
{
return d.a+d.b+d.c+d.d+d.f;
}
Compiles to this -
movsx eax, BYTE PTR [rcx+12]
add eax, DWORD PTR [rcx+8]
add eax, DWORD PTR [rcx+4]
add eax, DWORD PTR [rcx]
movd xmm0, eax
cvtdq2ps xmm0, xmm0
addss xmm0, DWORD PTR [rcx+16]
unpcklps xmm0, xmm0
cvtps2pd xmm0, xmm0
ret 0
So basically when you pass individual items the caller pushed them onto the stack and the function accesses them relative to the stack. When you pass a strcuture the caller copies the data items into a block of memory on the stack and then passed the address of that into the function, which accesses them relative to that.
The second way has a couple more assembly languge instructions but that it, so as far as I can tell from my tests there is no significant difference in efficiency between the two methods at all other than a few microseconds. In all my tests the compiler wanted to inline any calls anyway unless I forced it to call it via a pointer so it's possible that nothing is passed via the stack at all in your real program anyway.
In my opinion using a struct is clearer and there appear to be no significant differences in speed so go for that one :)
As always, if in doubt over performance you need to profile your exact setup