Supongamos que tengo una clase como¿Llamar al constructor de una clase vacía realmente usa alguna memoria?
class Empty{
Empty(int a){ cout << a; }
}
Y luego invocarlo usando
int main(){
Empty(2);
return 0;
}
Will esta causa cualquier memoria que se asignará en la pila para la creación de un objeto "vacío"? Obviamente, los argumentos deben ser empujados a la pila, pero no quiero incurrir en gastos adicionales. Básicamente, estoy usando el constructor como un miembro estático.
La razón por la que quiero hacer esto es por las plantillas. El código real se parece
template <int which>
class FuncName{
template <class T>
FuncName(const T &value){
if(which == 1){
// specific behavior
}else if(which == 2){
// other specific behavior
}
}
};
que me permite escribir algo como
int main(){
int a = 1;
FuncName<1>(a);
}
por lo que llego a especializar un parámetro de plantilla, al no tener que especificar el tipo de T
. Además, espero que el compilador optimice las otras ramas dentro del constructor. Si alguien sabe si esto es cierto o cómo verificarlo, sería muy apreciado. También asumí que lanzar plantillas a la situación no cambia el problema de la "clase vacía" de arriba, ¿es así?
La pregunta es por qué te importa.El trabajo del compilador es cuidar y generar el mejor código. Deberías concentrarte en escribir el código más expresivo. –
PS. No hay ningún requisito para que el argumento sea empujado en la pila. El C++ ABI no está definido de manera deliberada, por lo que los compiladores tienen la oportunidad de usar el registro para pasar los parámetros, si eso hace que el código sea más eficiente. –
Me importa porque quiero el mejor rendimiento posible; Realmente odio la actitud de que el código sea elegante y no te preocupes por estas cosas. A veces, estas cosas importan (yo hago informática de alto rendimiento). –