Quando una funzione C++ accetta un argomento std::vector
, il modello usuale è di passare dal const
riferimento, come ad esempio:efficiente passaggio di std :: vector
int sum2(const std::vector<int> &v)
{
int s = 0;
for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
return s;
}
Credo che risultati di questa codifica in doppia dereferenziazione quando gli elementi vettoriali sono accessibili, poiché la CPU deve prima chiamare il riferimento v
per leggere il puntatore al primo elemento, il quale puntatore deve essere nuovamente dereferenziato per leggere il primo elemento. Mi aspetterei che sarebbe più efficiente passare una copia superficiale dell'oggetto vettoriale sullo stack. Tale copia superficiale incapsulerebbe un puntatore al primo elemento e la dimensione, con il puntatore che fa riferimento alla stessa area di memoria del vettore originale.
int sum2(vector_ref<int> v)
{
int s = 0;
for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
return s;
}
Prestazioni simili, ma molto meno la comodità potrebbe essere ottenuta passando una coppia di iteratori di accesso casuale. La mia domanda è: che cosa è difettoso con questa idea? Mi aspetto che ci sia una buona ragione per cui le persone intelligenti accettano di pagare il costo performace del riferimento vettoriale o di affrontare l'inconveniente degli iteratori.
Edit: Sulla base dei pervenire al seguente indirizzo di seguito, si prega di prendere in considerazione la situazione se ho semplicemente rinominare il suggerito vector_ref
classe per fetta o gamma. L'intenzione è quella di utilizzare coppie iteratore ad accesso casuale con sintassi più naturale.
Avete effettivamente confrontato il codice macchina generato nei due casi? O misurato la prestazione? –
Hai controllato che è davvero così in assemblea? Inoltre, non penso che la convenzione delle coppie iteratore derivi da considerazioni sulle prestazioni, è una decisione di progettazione (e infatti boost sta favorendo un concetto molto più conveniente di oggetti gamma iteratore, anche se non ho studiato come funzionano esattamente). – UncleBens
Non penso che i tuoi commenti abbiano davvero alcun senso. Un riferimento è un alias di un oggetto. In quanto tale, non è più costoso accedere a un riferimento a un oggetto come sarebbe per accedere all'oggetto originale. Questa diatriba leggermente infiammatoria è una speculazione da parte tua, se tu avessi fatto due minuti di dovuta diligenza non avresti avuto bisogno di questo post. –