【问题标题】:Any performance penalty for wrapping int in a class?将 int 包装在一个类中会有任何性能损失吗?
【发布时间】:2012-07-19 19:00:45
【问题描述】:

我有一个包含许多向量、集合和地图的项目。在大多数情况下,键/索引是一个整数。我正在考虑创建小类,例如:

class PhoneRepoIx //index into map {phone_number => pointer}
{
public:
  int n;
};

class PersonIx //index into map {social_security_number => pointer}
{
public:
  int n;
};

我会招致任何速度或内存损失吗?有了内存,我 90% 确信每个实例没有内存成本,只有每个类类型。速度我不清楚。

动机: 使用上述方法,编译器会为我做一些额外的类型检查。此外,通过精心选择的显式类型名称,我的代码的读者将更容易看到我在做什么。到目前为止,我在任何地方都使用 int 并且我选择了变量名来表达每个索引是什么。有了以上内容,我的变量名可能会更短。

注意: Tyepdefs 没有完全解决我的问题,因为编译器不会做任何额外的类型检查,在内部所有类型都只是 int。

【问题讨论】:

  • struct PersonIx { int n; } 更短,完全相同,也不需要任何类型定义。而且我还认为不会有任何开销(除非使用该类型的代码由于包装器而人为地低于最佳值)
  • Tyepdefs do not address my issue completely as the compiler would not do any extra type-checking, internally all the types would just be int. 这是什么意思?你认为你需要什么“额外的类型检查”?我们需要在这里使用一个用法示例。
  • @Falmarri:“你的最后一个订单是 5 太多了。” “5”是指数量、包裹重量、付款金额、付款日期吗?
  • 忽略反对者,他们是无知的。这是一个很好的方法。
  • @BenVoigt 我不认为这是重复的,原因有以下三个:1) 尽管其中一些答案很好,但另一个问题的公认答案很糟糕。 2)这个问题是在性能影响之后专门询问的。 3)“重复”实际上是关于 C(这解释了接受的答案)。

标签: c++


【解决方案1】:

不同的编译器有不同的优化能力和不同的错误。理论上可以以精确的零开销编译它。你的编译器会达到这个理论极限吗?答案是明确的“也许”。至少有些编译器至少在某些时候会这样做。

更有趣的问题是您是否应该担心可能的性能下降。这个问题的答案是强烈的“不”。直到您的程序确实显示了不可接受的性能数据。

【讨论】:

  • 这个答案大大低估了现代编译器的能力。我期望有一个像样的编译器来将此代码编译到零开销。事实上,有几个库(其中包括 C++ 标准库的一部分)需要编译器来执行此操作,以免它们遭受巨大的性能打击。一般来说,答案不是“也许”,而是“是”或“改变你的编译器”。
  • @KonradRudolph:我曾多次比较 g++ 为裸类型和包装类型生成的程序集。大多数时候开销为零,但并非总是如此。在这方面,clang++ 比 g++ 差一些。
【解决方案2】:

我建议使用模板来获得你想要的。

template <typename T>
struct Index {
    Index(int value) : value(value) {}
    int value;
};

这样使用。

struct PhoneRepoIx {};
Index<PhoneRepoIx> PhoneIndex(1);
list[PhoneIndex.value];

【讨论】:

    【解决方案3】:

    这个类通常会调用两个函数:

    • 构造函数
    • operator

    我认为上面的答案“别担心”听起来不错(配置文件然后优化)。但是要弄清楚为什么这不会导致任何减速(猜测):

    • 构造函数:没有理由一个体面的编译器不能将其转换为堆栈指针增量(为 int 腾出空间),然后设置可用空间。
    • operator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多