Nel frammento di codice qui sotto, ho una classe che contiene un vettore e un getter per accedervi. Quando compilavo il mio codice con le ottimizzazioni attivate, mi sarei aspettato che la chiamata a get_value () venisse ottimizzata e una accede direttamente ai dati. Invece, il processo è lento, e una rapida profilazione mostra che c'è molta copia della memoria in corso.
class Data {
public:
std::vector<double> get_value() const { return value_; }
private:
std::vector<double> value_;
};
Data ex(...); //pass value
for (unsigned i=0; i<ex.get_value().size(); ++i) {
//do things with
ex.get_value()[i];
}
Domanda 1: Perché è così?
Domanda 2: Come posso risolverlo? Per questa domanda, ho due risposte che non mi soddisfano. La prima possibilità è di memorizzare il valore localmente prima del ciclo. Ma questo implica una copia, e se ci sono molti valori diversi da ottenere, ciò implicherebbe un sacco di setup, che è una cattiva pratica di programmazione. La seconda possibilità sarebbe quella di eseguire questo ciclo in una funzione membro della classe. Ma se la funzione non è concettualmente correlata alla classe e deve solo usarla, sarebbe anche una cattiva pratica di codifica.