2011-07-18 12 views
22

en C++C++ pasar argumentos por referencia y el puntero

class bar 
{ 
    int i; 
    char b; 
    float d; 
}; 

void foo (bar arg); 
void foo (bar &arg); 
void foo (bar *arg); 

esto es una muestra de la clase/estructura y funciones
tengo alguna Qs

  • cuál es la diferencia entre la primera y la segunda forma de pasar el argumento en 'asm', tamaño, velocidad?
  • cómo se transmiten los argumentos de las funciones de foo en cada caso (en el caso de puntero i sé el puntero se empuja en la pila)
  • argumentos cuando pasan, en términos de eficiencia al (velocidad, tamaño, preferibilidad) que es mejor ?
  • ¿Cuál es la sintaxis intel 'asm' que corresponde a cada una de las formas de pasar los argumentos?

sé lo que dice la mayoría de "no importa en los compiladores modernos y las CPU", pero ¿y si estamos hablando de CPUs o compiladores antiguos?

gracias de antemano

+1

CPU no importa. Pasar por valor implica más trabajo para todos, pero tipos más pequeños que el tamaño de un puntero. Vea la respuesta de cnicutar. –

+0

importa tanto en la CPU moderna como en la antigua CPU.Tenga en cuenta que el x86 es una CPU antigua, incluso con sus mejoras modernas, tiene una buena cantidad de equipaje de la vieja escuela que tiene que llevar, especialmente relacionado con este tema. cnicutar tiene una respuesta tan buena que no vale la pena repetirla o reformularla. –

Respuesta

21

el puntero y los métodos de referencia deben ser bastante comparable (tanto en la velocidad, el uso de memoria y el código generado).

Pasar una clase obliga directamente al compilador a duplicar la memoria y poner una copia del objeto bar en la pila. Lo que es peor, en C++ hay todo tipo de bits desagradables (el constructor de copia predeterminado y otras cosas) asociados a esto.

En C siempre uso (posiblemente const) punteros. En C++ es probable que use referencias.

+1

No solo comparable, sino exactamente lo mismo. Una * referencia * es solo una variante * sintáctica * de un * puntero *. –

+3

a excepción de las diferencias mencionadas aquí: http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c –

+2

@edA: indique un cita del estándar que demuestra que "Una referencia es solo una variante sintáctica de un puntero". – fredoverflow

1

De cualquier forma razonable, pasar por referencia probablemente resulte en código que involucre direcciones de objetos. Sin embargo, el problema principal es que el uso de referencias es más idiomático que C++ y debería ser el estilo preferido; realmente no deberías ver mucho los punteros crudos en tu propio código.

También tenga en cuenta que pasar por valor y por referencia es fundamentalmente diferente en el sentido de que pasar por referencia le permite al destinatario modificar el argumento. En todo caso, debe comparar f(bar) con f(const bar &).

1

Los punteros y las referencias difieren sintácticamente, y por lo general son idénticos en tiempo de ejecución y generación de código. En cuanto a los compiladores antiguos ... sabía un error en el compilador Borland 3 C++ DOS: almacenaba en caché un valor int (pasado por referencia) en un registro, lo modificaba y no cambiaba el valor original en la memoria. Al pasar por un puntero, un código equivalente funcionó como se esperaba.

Sin embargo, no creo que cualquier compilador moderno puede hacer cosas tan extrañas (5 y Borland ha fijado el número)

En cuanto al estilo de código (aparte de punteros vs smartpointers compensación), que suelen utilizar referencias si la dirección no puede ser NULL por contrato de función, y use punteros de lo contrario.

+2

Borland 3? Eso es tan viejo que no estoy seguro de que incluso admita monitores de color. – MSalters

+1

@MSalters: admite color _text_ monitores ... e incluso referencias C++ ... de alguna manera específica :) – user396672

0

La función foo puede modificar arg en los casos 2 y 3. En los primeros casos, el compilador podría optimizar la creación de copias, por lo que es muy difícil comparar el uso de la CPU y la memoria.

Cuestiones relacionadas