Considere el siguiente ejemplo:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
El código de ensamblaje generado para vector::empty
(por clang, con optimizaciones):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
¿Por qué asigna espacio de pila? No se usa en absoluto. El push
y pop
podría ser omitido. Las compilaciones optimizadas de MSVC y gcc también usan espacio de pila para esta función (ver en godbolt ), por lo que debe haber una razón.
@Bob__: No. ¿Por qué debería hacerlo?
—
Dr. Gut
vector::size()
no está definido en el ejemplo para simular que no está en línea.
Entonces, ¿cómo podría un compilador optimizar algo que no sabe?
—
Bob__
@Bob__: Creo que conocer la implementación de
—
Dr. Gut
vector::size()
no es relevante para asignar o no asignar un marco de pila vector::empty()
. En empty()
esto solo se llama, sea lo que sea.
Bueno, estás llamando a una función que devuelve algo, necesitas espacio para eso (si no sabes nada mejor).
—
Bob__
this
parámetro implícito ?