Sono identici; prova - ho compilato e salvato il codice assembly generato sia da MSVC 2015 e GCC 4.9.3 per questi campioni a due code:
// 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;
}
faccio notare che le operazioni di cui foo
sono casuali e non realmente rilevanti per la prova; servono solo a impedire al compilatore di ottimizzare il metodo.
// 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;
}
Nei file assembly generato, il GCC sono esattamente identici, e in MSVC, letteralmente le uniche differenze sono:
- I nomi delle variabili nei commenti (s vs AS)
- I numeri di riga di riferimento (poiché quelli diversi sono non commentati in ogni versione).
Pertanto, è lecito ritenere che questi due metodi siano identici.
fonte
2016-04-29 03:23:12
https://godbolt.org/g/3iq38U è possibile vedere hanno generato lo stesso codice macchina –