2012-05-30 11 views
6

me escribió el siguiente código:C++ devolución de una copia objeto

class MyObjectHolder { 
public: 
    std::vector<int> getMyObject() const { 
     return myObject; 
    } 

private: 
    std::vector<int> myObject; 
}; 

En algún momento de mi programa intento utilizar el método getMyObject y utilizar sólo const métodos en el objeto recuperado:

const std::vector<int> myObject = myObjectHolder.getMyObject(); 
myObject.size(); 
int a = myObject.front(); 
  • Ahora, es posible que el compilador optimice este código para que no haya copias del std::vector<int> están hechos?

    ¿Es posible de alguna manera que el compilador determina que sólo estoy usando los const métodos en el objeto recuperado (y vamos a suponer que no hay mutable absurdo sucediendo detrás de él) y no tendría ninguna copia de los objetos y realice estas operaciones const en el miembro private del MyObjectHolder en su lugar?

  • En caso afirmativo, ¿sería posible si no declara explícitamente el const std::vector<int> myObject como const?

  • Si no, ¿cuáles son las razones para no hacer esto? ¿En qué casos esta optimización sería difícil de implementar/deducir que es posible y correcta aquí/etc ...?

+2

[RVO] (http://en.wikipedia.org/wiki/Return_value_optimization) implica objetos temporales. A menos que me falta algo, no hay objetos temporales aquí, así que no hay ningún RVO. – hmjd

+0

@hmjd Derecha. No debería estar hablando del 'RVO' aquí, solo acerca de la posible optimización con el uso de la variable' private' directamente. Gracias. –

Respuesta

6

Ahora bien, ¿es posible que el compilador optimizará el código de manera que no hay copias de la std::vector<int> se hacen?

No, el compilador no sabe lo que las personas que llaman a hacer con ese objeto a menos que usted está haciendo uso de la optimización global durante todo el código que utiliza el objeto (el compilador no puede generalmente hacer suposiciones acerca de su uso, por otra parte si el objeto se exporta desde un dll, no puede hacer ninguna suposición).

En caso afirmativo, ¿sería posible si no declarase explícitamente el const std :: vector myObject como const?

No, de todos modos, la conversión de non-const a const podría ser implícita.

Si no, ¿cuáles son las razones para no hacerlo? ¿En qué casos esta optimización sería difícil de implementar/deducir que es posible y correcta aquí/etc ...?

Es una optmiziation que se debe hacer en el interior getMyObject() pero el compilador no puede estar seguro de que las personas que llaman no se desecharon la const. De hecho, este es un debate muy antiguo sobre el uso de const, por lo general creo que es más claro pensar siempre en const como algo para programadores y no para compiladores.

+1

"No, el compilador no sabe qué harán las personas que llaman con ese objeto". -> No es generalmente correcto. Cambio propuesto: "A menos que esté haciendo uso de la optimización global sobre todos los códigos que el objeto, el compilador generalmente no puede hacer suposiciones" o similar. –

+0

@phresnel tienes razón (editado); además, si el objeto se exporta no puede hacer ninguna suposición (y no estoy seguro de que pueda seguir lanzamientos dentro de la misma unidad). –

+1

Aún más, el compilador puede escupir varias versiones de la misma función, lo que significaría una edición aún más generalizada: P –

3

sugeriría a utilizar

const std::vector<int>& getMyObject() const { 
    return myObject; 
} 

Sería volver la referencia constante de myObject sin copiar eso.

Y utilizar el resultado con

const std::vector<int>& myObject = myObjectHolder.getMyObject(); 
Cuestiones relacionadas