gpt4 book ai didi

c++ - 性能 : typedef vs wrapper class for primitive types?

转载 作者:可可西里 更新时间:2023-11-01 18:19:02 26 4
gpt4 key购买 nike

我想在 C++ 中定义一个新类型,它只是一些原始类型(在我的示例中,int 可以是任何类型)。在此示例中,我将类型称为 NodeId

我可以只使用 typedef int NodeId。我想要 NodeId 的默认值,所以我会使用 #define NULL_NODE_ID -1

现在,我认为定义一个类而不是 typedef 会更好,以允许函数 isValid() 和构造 null NodeId 的默认构造函数:

class NodeId
{
int value;
public:
inline NodeId() : value(-1) {}
inline NodeId(int value) : value(value) {}
inline operator int() {return value;}
inline bool isValid() {return value != -1;}
//...
};

是否存在导致使用第二种方法的任何性能劣势?

最佳答案

实际上,这可能会变慢的原因有两个。

首先,无法创建未初始化的 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);

关于c++ - 性能 : typedef vs wrapper class for primitive types?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com