实际上,这可能会变慢有两个原因。
首先,无法创建未初始化的 NodeId。通常,这是一件好事。但是想象一下你有这样的代码:
NodeId nodeid;
foo.initializeNodeId(&nodeid);
你会做一个实际上没有必要的额外任务。
您可以通过添加一个特殊的构造函数来解决这个问题。创建一个 Foo::createNodeId() 可能要好得多,这样你就不需要 Foo::initializeNodeId(&NodeId),但如果你不控制 Foo 的定义,那可能是不可能的。
其次,NodeId 不是编译时常量表达式。正如 dasblinkenlight 所暗示的,这更可能导致代码不合法而不是导致性能问题,但两者都有可能。(为什么?因为您可能会强制编译器在运行时插入代码来执行一些计算,如果您使用的是 int,那么这可能在编译时完成。这对于名为 NodeId 的类来说可能不是问题...... )
幸运的是,如果您使用的是 C++11,则可以使用 constexpr 修复它。如果你希望你的代码也是合法的 C++03,你可以用一个宏来处理它。
此外,正如 dasblinkenlight 所指出的,您在两种方法中都缺少 const 。
最后,没有理由在类定义中定义的方法上写“内联”;它们本身就已经是内联的了。
把它们放在一起:
#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);