2011-06-26 12 views
10

Antes de que alguien salte y dice Profile before optimize!, esto es simplemente una pregunta de curiosidad y proviene de this original question.¿El compilador de C++ optimizará el valor de retorno no utilizado por `referencia`?

Si regreso por referencia el mismo objeto, ¿se optimizaría si no se utiliza? Por ejemplo, tengo un Vector<> que tiene varias funciones matemáticas (supongamos que no estoy usando la sobrecarga del operador). Dos formas de escribirlo:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector 

O

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector 

Ahora bien, si Add() se utiliza sin utilizar el valor de retorno, será el compilador simplemente tirar la vuelta por completo y la función se vuelve como si no tiene valor de retorno para comenzar? ¿Y si NO es inlined?

Respuesta

11

Las referencias como argumentos o enunciados de devoluciones se implementan generalmente de manera similar a los punteros y el costo es mínimo (insignificante en la mayoría de los casos). Dependiendo de la convención de llamadas, puede ser una única tienda en un registro.

En cuanto a si la devolución puede optimizarse, a menos que el compilador esté escribiendo el código no, no puede. Cuando el compilador procesa la función, no sabe si el código de llamada usará o no la declaración de devolución, y eso a su vez significa que siempre debe devolver algo.

+0

+1, otra buena respuesta como siempre :) –

+2

Esto supone que el compilador procesará la función una vez en lugar de procesarla cada vez que se invoca. Muchos compiladores modernos hacen (o pueden configurarse para hacer) lo último. Una de las razones por las que lo hacen es permitir precisamente este tipo de optimización. –

+0

"a menos que el compilador incluya el código no", lo que significa que "hoy en día, con LTO, todo el código de objeto no compartido puede estar en línea, así que probablemente sí" :-) –

4

Si la función no está en línea, entonces sí, el valor de retorno debe almacenarse en algún lugar, probablemente un registro de CPU. Esto probablemente solo requiera una sola copia de registro. Me sorprendería si la sobrecarga fuera más que un solo ciclo de CPU en la mayoría de los casos.

Cuestiones relacionadas