Quando viene utilizzata l'ottimizzazione del valore di ritorno? [chiuso]

0

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.

    
posta yannick 06.10.2017 - 10:13
fonte

1 risposta

3

Question 1: Why is that?

Poiché ex.value_ deve ancora avere lo stesso stato dopo aver chiamato ex.get_value() . RVO è sicuro nelle stesse circostanze in cui std::move è sicuro, vale a dire quando non importa che stai modificando un oggetto, perché sta per essere distrutto.

Question 2: How do I fix it?

Ha Data::get_value restituisce un riferimento const.

In alternativa:

class Data {
  public:
   template<typename UnaryFunctor>
   UnaryFunctor use_value(UnaryFunctor && uf) const 
   { for (double v: value_) { uf(v); } return uf; }
  private:
   std::vector<double> value_;
};

Qui abbiamo un modello che esegue il ciclo, ma prende il corpo del ciclo come parametro. Restituisce anche l'oggetto funzione (potenzialmente statico) come risultato.

    
risposta data 06.10.2017 - 10:29
fonte

Leggi altre domande sui tag