In questo Stack Overflow answer è dimostrato che l'aliasing in C++ può rallentare il codice. E l'aliasing in C++ non si applica solo ai puntatori, si applica anche ai riferimenti e, più in generale, a these types specified by the standard. In particolare, v'èCome evitare l'aliasing e migliorare le prestazioni?
un tipo di aggregato o unione che include uno dei tipi indicati sopra tra i suoi componenti (compresi, ricorsivamente, un membro di un subaggregate o unione contenuta)
Quindi, secondo la mia comprensione , se ho codice come qui di seguito,
class A{
public:
int val;
};
void foo(vector<A> & array, int & size, A & a0) {
for(int i=0;i<size;++i) {
array[i].val = 2*a0.val;
}
}
ed è possibile che a0
può alias uno degli elementi in array
, anche eventualmente alias size
causa di la citazione di cui sopra, quindi a0
e size
devono essere caricati per ogni iterazione con conseguente riduzione delle prestazioni.
- Quindi la mia domanda è cosa devo fare al codice per evitare l'aliasing e migliorare le prestazioni?
- Il passaggio da
const &
non aiuta poiché non eviterà l'aliasing come specificato dallo standard. Passaa0
in base al valore? Ma questo farà una copia dia0
che non mi piace, dal momento che in pratica la classeA
può essere molto complessa e la copia è un'opzione molto costosa. - Esiste una soluzione generale per evitare l'aliasing in C++? Se sì, che cos'è?
La proposta che faccio riferimento a [Clark Nelson è pertinente] (http://stackoverflow.com/a/27914489/1708801) sebbene sia una proposta in C che menziona è rilevante anche per WG21 (C++) anche se lui non ha avuto il tempo di fornire la dicitura WG21. –
Non ho molta familiarità con il comportamento di aliasing ma di quello che sto leggendo, purché i valori che la funzione ha bisogno di leggere possano essere provati dal compilatore per non essere potenziali alias l'uno dell'altro secondo le regole, dovrebbe evitare le spese generali di aggiornamento del valore ogni volta. Ad esempio, in questo esempio (e potrei sbagliarmi) non ci dovrebbe essere aliasing perché 'int',' vector 'e' A' non sono tipi che possono riferirsi tra loro ad eccezione di 'int &' puntando a 'A :: val'. –
@XerenNarcy 'a0' potrebbe essere un riferimento a uno degli elementi di' array' –