Visual c ++ 2008, 64-битный, кажется, передает структуру, когда вызывающая сторона выделяет место для копии структуры в ее стеке и копирует элементы данных в нее, а затем передает только адрес этой копии в функцию по значению.
Этот простой пример скомпилирован следующим образом -
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;
}
Компилирует к этому -
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
Таким образом, в основном, когда вы передаете отдельные элементы, вызывающая сторона помещает их в стек, и функция обращается к ним относительно стека. Когда вы передаете strcuture, вызывающая сторона копирует элементы данных в блок памяти в стеке, а затем передает адрес этого в функцию, которая обращается к ним относительно этого.
Во втором способе есть еще пара инструкций на языке ассемблера, но, насколько я могу судить по моим тестам, нет никакой значительной разницы в эффективности между этими двумя методами, за исключением нескольких микросекунд. Во всех моих тестах компилятор все равно хотел встроить любые вызовы, если я не заставлял его вызывать его через указатель, так что вполне возможно, что в вашей реальной программе все равно ничего не передается через стек.
По моему мнению, использование структуры более понятно, и, по-видимому, нет существенных различий в скорости, поэтому сделайте это:)
Как всегда, если вы сомневаетесь в производительности, вам нужно профилировать свои точные настройки