Visual C++ 2008 64 Bit scheint die Struktur zu übergeben, indem der Aufrufer Platz für eine Kopie der Struktur auf seinem Stapel zuweisen und die Datenelemente in es kopieren und dann nur die Adresse dieser Kopie in die Funktion durch Wert übergeben.
Dieses einfache Beispiel wurde wie folgt zusammengestellt
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;
}
Kompiliert zu diesem -
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
Wenn Sie also einzelne Elemente übergeben, schiebt der Aufrufer sie auf den Stapel und die Funktion greift relativ zum Stapel auf sie zu. Bei der Übergabe einer Zeichenkette kopiert der Aufrufer die Datenelemente in einen Speicherblock auf dem Stack und übergibt dann die Adresse dieses Blocks an die Funktion, die dann relativ dazu auf die Daten zugreift.
Der zweite Weg hat ein paar mehr Assembler-Anweisungen, aber das ist es, so weit ich aus meinen Tests sagen kann, gibt es keinen signifikanten Unterschied in der Effizienz zwischen den beiden Methoden überhaupt andere als ein paar Mikrosekunden. In allen meinen Tests wollte der Compiler sowieso alle Aufrufe inline schalten, es sei denn, ich zwang ihn, sie über einen Zeiger aufzurufen, so dass es möglich ist, dass in Ihrem echten Programm überhaupt nichts über den Stack übergeben wird.
Meiner Meinung nach ist die Verwendung einer Struktur übersichtlicher und es scheint keine signifikanten Geschwindigkeitsunterschiede zu geben, also entscheide dich für diese :)
Wie immer, wenn Sie Zweifel an der Leistung haben, müssen Sie ein Profil Ihrer genauen Konfiguration erstellen.
11 Stimmen
Einfacher Weg, das herauszufinden: Profil und Test
1 Stimmen
Der kompilierte Code sollte für die x86- und ARM-Standardaufrufkonvention gleich sein.
0 Stimmen
Ist die
...
die varargs angeben, oder haben Sie einige Parameter weggelassen?0 Stimmen
Abgesehen von der Effizienz macht die Kapselung der Parameter in einer Struktur den Code einfacher zu pflegen und verringert das Risiko, die Argumente versehentlich in der falschen Reihenfolge zu übergeben.