2012-05-08 12 views
5

Bueno, creo que el título es bastante directo. He leído muchas veces que uno debe evitar copiar objetos pesados, y parece bastante racional (¿quién querría ser un fanático de la memoria?). La pregunta es, ¿cuándo un objeto debe considerarse pesado? ¿cuántos miembros?¿Cuándo es un objeto lo suficientemente pesado como para evitar copiar?

+3

Depende completamente de qué objeto es y cómo se usa. –

+5

Si puede evitar copiar, ¿por qué no evitarlo todo el tiempo? –

+1

@James McNellis: y la arquitectura en la que se está ejecutando. – m0skit0

Respuesta

5

Cada vez que el objeto que está pasando es más grande que el tamaño de un puntero (normalmente 4 bytes en 32 bits, 8 bytes en 64 bits), entonces sería más eficiente evitar la copia.

Aun cuando no se debe pasarlo por referencia/puntero depende de la cantidad de trabajo extra que será, y lo que va a hacer con los datos. Si pasas por referencia solo para crear una copia y modificarla en tu función, entonces has vencido el propósito. En cualquier momento pasarlo como const by-reference es suficiente, entonces probablemente sea una buena idea hacerlo.

Sin embargo, tenga en cuenta que la mayoría de los compiladores son lo suficientemente inteligentes como para optimizar la copia de un objeto de solo lectura cuando el código se compila con optimizaciones. Así que no tiene que preocuparse realmente a menos que se convierta en un cuello de botella y pueda probarlo cuantitativamente.

+0

Yo agregaría que es preferible pasar un puntero y, a veces, la única forma de lograr ciertos diseños, es decir. puntero a interfaces, chorros, punteros a funciones, etc. – EdChum

+0

Pasar por referencia evita algunas optimizaciones que el compilador puede realizar en los valores, por lo que no es tan seco y cortante como eso. C++ 11 parece haber cambiado también las antiguas reglas generales, algunos aconsejan que se pase de valor en muchos lugares en los que anteriormente habías pasado por referencia constante, particularmente para objetos de valor como std :: string, debido a para mover la semántica. – ergosys

Cuestiones relacionadas