在类中包装int的任何性能惩罚

Any performance penalty for wrapping int in a class?

本文关键字:任何 性能 惩罚 int 包装      更新时间:2023-10-16

我有一个包含许多向量、集合和映射的项目。在大多数情况下,键/索引是一个整数。我正在考虑创建像这样的小类

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。

不同的编译器有不同的优化能力和错误。从理论上讲,完全可以在零开销的情况下编译它。你的编译器会达到这个理论极限吗?答案是肯定的"也许"。至少有一些编译器至少在某些时候会这样做。

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

我建议使用模板来获得您想要的东西。

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

这是像这样使用的。

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

此类上通常会调用两个函数:

  • 施工单位
  • 运算符<(由于STL映射是一个树impl,密钥应该支持这一点)

我认为上面的答案"别担心"听起来很不错(配置文件然后优化)。但为了破解为什么这不会导致任何放缓(猜测):

  • 构造函数:一个好的编译器没有理由不能将其转换为堆栈指针增量(为int腾出空间),然后设置可用空间
  • 运算符<:一个好的编译器没有理由不能内联两个对象的n之间的简单比较