Są identyczne; Dowód - skompilowany i zapisany kod montaż generowany zarówno przez MSVC 2015 i GCC 4.9.3 dla tych dwóch próbek kodu:
// Case 1: Pass by reference to single struct
typedef struct _mystruct
{
int x;
int y;
} mystruct;
void foo(mystruct *s, int count)
{
int i;
for(i = 0; i < count; i++)
{
(*(s + i)).x = 5;
(*(s + i)).y = 7;
}
}
int main()
{
mystruct ps;
//mystruct as[1];
foo(&ps, 1);
//foo(as, 1);
return 0;
}
Pragnę zauważyć, że operacje w foo
są przypadkowe i nie bardzo odpowiednie do badania; mają one jedynie zapobiegać optymalizacji metody przez kompilator.
// Case 2: 1-length array
typedef struct _mystruct
{
int x;
int y;
} mystruct;
void foo(mystruct *s, int count)
{
int i;
for(i = 0; i < count; i++)
{
(*(s + i)).x = 5;
(*(s + i)).y = 7;
}
}
int main()
{
//mystruct ps;
mystruct as[1];
//foo(&ps, 1);
foo(as, 1);
return 0;
}
w generowanych plikach montażowych, na GCC są dokładnie identyczne, a w MSVC, dosłownie jedyne różnice to:
- Nazwy zmiennych w komentarzach (s vs AS)
- Numery linii, do których się odwołano (ponieważ różne są odkomentowane w każdej wersji).
Dlatego można bezpiecznie założyć, że te dwie metody są identyczne.
https://godbolt.org/g/3iq38U widzisz, że wygenerowali ten sam kod maszynowy –