En realidad, hay dos razones que esto posiblemente podría ser más lento.
En primer lugar, no hay forma de crear un NodeId no inicializado. Normalmente, eso es bueno cosa. Pero imagine que tiene un código como éste:
NodeId nodeid;
foo.initializeNodeId(&nodeid);
Se va a realizar una misión extra que no es realmente necesario.
Puede solucionarlo agregando un constructor especial. Probablemente sea mucho mejor crear un Foo :: createNodeId() por lo que no necesita Foo :: initializeNodeId (& NodeId), pero si no controla la definición de Foo, puede que no sea posible.
En segundo lugar, un NodeId no es una expresión constante en tiempo de compilación. Como dasblinkenlight sugiere, es mucho más probable que cause problemas con el código que no sea legal que causar problemas de rendimiento, pero ambos son posibles. (¿Por qué? Porque puede estar forzando al compilador a insertar código para hacer algunos cálculos en tiempo de ejecución que podrían haberse hecho en tiempo de compilación, si estaba usando un int. No es probable que esto sea un problema para una clase llamada NodeId ...)
Afortunadamente, si estás usando C++ 11, se puede arreglar eso con constexpr. Y si quiere que su código también sea legal C++ 03, puede lidiar con eso con una macro.
Además, como ha señalado dasblinkenlight, que se está perdiendo const en dos métodos.
Por último, no hay razón para escribir "en línea" en los métodos que se definen dentro de la definición de la clase; ya están intrínsecamente en línea.
Poniendo todo junto:
#if __cplusplus > 201000L
#define CONSTEXPR_ constexpr
#else
#define CONSTEXPR_
#endif
class NodeId
{
int value;
public:
struct Uninitialized {};
CONSTEXPR_ NodeId() : value(-1) {}
CONSTEXPR_ NodeId(Uninitialized) {}
CONSTEXPR_ NodeId(int value) : value(value) {}
CONSTEXPR_ operator int() const {return value;}
CONSTEXPR_ bool isValid() const {return value != -1;}
//...
};
Ahora usted puede hacer esto, para evitar el costo de un -1 asignación adicional.
NodeId nodeId(NodeId::Uninitialized());
foo.initializeNodeId(&nodeid);
Y esto, para usar legalmente un NODEID como un parámetro de plantilla no Tipo:
myClassTemplate<NodeId(3)> c;
O, esto, para estar seguro de que el compilador puede legalmente solo inicializar X a 4:
int x = 3;
x += NodeId(1);
Si usa un nuevo compilador, entonces debería ser lo mismo que usar el int. – mfontanini
@mfontanini Entonces, ¿por qué rechazaste la pregunta? Esta es la respuesta a la pregunta, debe publicarlo como tal. – leemes
@leemes ¿por qué estás asumiendo que fui yo? – mfontanini