其實,有兩個原因,這可以令人信服地慢。
首先,沒有辦法創建未初始化的NodeId。通常情況下,這是一個好的的事情。但想象你有這樣的代碼:
NodeId nodeid;
foo.initializeNodeId(&nodeid);
你會做一個額外的任務,這實際上是不必要的。
你可以通過添加一個特殊的構造函數來解決這個問題。創建一個Foo :: createNodeId()可能會好得多,所以你不需要Foo :: initializeNodeId(& NodeId),但是如果你不控制Foo的定義,那可能是不可能的。
其次,NodeId不是編譯時常量表達式。正如dasblinkenlight所暗示的,這很可能會導致代碼不合法的問題,而不是引起性能問題,但兩者都是可能的。 (爲什麼?因爲你可能會迫使編譯器在運行時插入代碼,以便在編譯時完成一些計算,如果你使用的是int,那麼這可能是一個叫做NodeId的類的問題。 )
幸運的是,如果您使用的是C++ 11,則可以使用constexpr修復此問題。如果你希望你的代碼也是合法的C++ 03,你可以用宏處理。
此外,正如dasblinkenlight所指出的,您在兩種方法中缺少const。
最後,沒有理由在類定義中定義的方法上寫入「inline」;它們本來就是內聯的。
全部放在一起:
#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;}
//...
};
現在你可以做到這一點,以避免額外的-1分配的成本。
NodeId nodeId(NodeId::Uninitialized());
foo.initializeNodeId(&nodeid);
而這一點,合法使用的NodeId作爲非類型模板參數:
myClassTemplate<NodeId(3)> c;
或者,這一點,以確保編譯器可以合法只是初始化x到4:
int x = 3;
x += NodeId(1);
如果使用新的編譯器,那應該和使用int相同。 – mfontanini
@mfontanini那麼你爲什麼低估了這個問題?這是對這個問題的回答,你應該像這樣發佈。 – leemes
@leemes你爲什麼假設這是我? – mfontanini