C++ 在类中包装int有性能损失吗?

C++ 在类中包装int有性能损失吗?,c++,C++,我有一个有很多向量、集合和地图的项目。在大多数情况下,键/索引是一个整数。我正在考虑创建小型课程,如: class PhoneRepoIx //index into map {phone_number => pointer} { public: int n; }; class PersonIx //index into map {social_security_number => pointer} { public: int n; }; 我会受到任何速度或记忆的惩罚吗?有

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

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,我选择了变量名来表示每个索引是什么。使用上述方法,我的变量名可以更短

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

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

template <typename T>
struct Index {
    Index(int value) : value(value) {}
    int value;
};
模板
结构索引{
索引(int值):值(value){}
int值;
};
这个用起来像

struct PhoneRepoIx {};
Index<PhoneRepoIx> PhoneIndex(1);
list[PhoneIndex.value];
struct PhoneRepoIx{};
指数电话指数(1);
列表[PhoneIndex.value];

不同的编译器有不同的优化能力和错误。从理论上讲,以零开销编译此文件是可能的。你的编译器会达到这个理论极限吗?答案是肯定的“可能”。至少有一些编译器在某些时候会这样做


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

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

  • 建造师
  • 运算符<(由于STL映射是一个树impl,因此键应支持此操作)
我认为上面的答案“别担心”听起来很好(配置文件然后优化)。但是,为了解释为什么这不会导致任何减速(猜测):

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

  • 运算符writing
    struct PersonIx{int n;}
    更短,完全相同,也不需要任何typedef。而且我还认为不会有任何开销(除非使用类型的代码会因为包装器而人为地变得不太理想)
    tyepdef不会完全解决我的问题,因为编译器不会做任何额外的类型检查,内部所有类型都是int。
    这到底意味着什么?你认为你需要什么“额外的类型检查”?我们需要在这里使用一个用法示例。@Falmari:“你上一次的订单太多了5个。”5是指数量、包装重量、付款金额、付款日期吗?别理那些反对者,他们是无知的。这是一个很好的方法。@BenVoigt我不认为它是重复的,原因有三:1)尽管有些答案是好的,但另一个问题的公认答案很糟糕。2) 这个问题是在性能影响之后特别提出的。3) “复制”实际上是关于C的(这解释了公认的答案)。这个答案大大低估了现代编译器的能力。我希望有一个像样的编译器将此代码编译到零开销。事实上,有几个库(其中包括C++标准库的部分)需要编译器来执行,以免遭受大规模性能攻击。一般来说,答案不是“可能”,而是“是”或“更改编译器”。@KonradRudolph:我曾多次比较过g++生成的裸类型和包装类型的程序集。大多数情况下,开销为零,但并非总是如此。在这方面,clang++比g++差一些。