Tatsächlich gibt es zwei Gründe, dies denkbar langsamer sein könnte.
Zunächst gibt es keine Möglichkeit, eine nicht initialisierte NodeId zu erstellen. Normalerweise ist das eine gute Sache. Aber stellen Sie Code wie dieses:
NodeId nodeid;
foo.initializeNodeId(&nodeid);
Sie erhalten eine zusätzliche Zuweisung tun, die nicht wirklich notwendig ist.
Sie können das beheben, indem Sie einen speziellen Konstruktor hinzufügen. Es ist wahrscheinlich viel besser, ein Foo :: createNodeId() zu erstellen, so dass Sie Foo :: initializeNodeId (& NodeId) nicht benötigen, aber wenn Sie die Definition von Foo nicht kontrollieren, ist das möglicherweise nicht möglich.
Zweitens ist eine NodeId kein kompilierbarer Konstantenausdruck. Wie dasblinkenlight andeutet, ist dies viel wahrscheinlicher, dass es Probleme gibt, dass Code nicht legal ist, um Leistungsprobleme zu verursachen, aber beides ist möglich. (Warum? Weil Sie den Compiler zwingt, Code einzufügen, um einige Berechnungen zur Laufzeit durchzuführen, die zur Kompilierungszeit hätten ausgeführt werden können, wenn Sie einen int verwendet hätten. Nicht dass dies ein Problem für eine Klasse namens NodeId wäre ...
) Zum Glück
, wenn Sie mit C 11 ++, können Sie das in Ordnung bringen mit constexpr. Und wenn Ihr Code auch C++ 03 sein soll, können Sie das mit einem Makro erledigen.
Auch, wie durch dasblinkenlight wies darauf hin, sind Sie nicht const in zwei Methoden.
Schließlich gibt es noch keinen Grund, „inline“ auf Methoden zu schreiben, die innerhalb der Klassendefinition definiert sind; Sie sind bereits inhärent inline.
es Putting alles zusammen:
#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;}
//...
};
Jetzt können Sie dies tun, die Kosten für eine zusätzliche -1 Zuordnung zu vermeiden.
NodeId nodeId(NodeId::Uninitialized());
foo.initializeNodeId(&nodeid);
Und dies rechtlich eine NodeId als nicht-Typ Template-Parameter zu verwenden:
myClassTemplate<NodeId(3)> c;
Oder dies kann der Compiler sicher sein legal nur x bis 4 initialisieren:
int x = 3;
x += NodeId(1);
Wenn Sie einen neuen Compiler verwenden, dann soll, dass das gleiche sein wie die int verwenden. – mfontanini
@mfontanini Warum haben Sie dann die Frage abgelehnt? Dies ist die Antwort auf die Frage, die Sie als solche posten sollten. – leemes
@leemes Warum gehst du davon aus, dass ich es war? – mfontanini