在类中包装int的任何性能惩罚
Any performance penalty for wrapping int in a class?
我有一个包含许多向量、集合和映射的项目。在大多数情况下,键/索引是一个整数。我正在考虑创建像这样的小类
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之间的简单比较
相关文章:
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 在类中始终使用此指针是否有任何性能成本
- 从交换机块返回时的任何性能差异
- 任何性能问题都在qt框架中使用了stackedwidget的最大页面数
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 当使用不相等vs均等时,是否存在任何性能差异
- 重载运算符:常量与非常量返回类型:任何性能差异
- 在类中包装int的任何性能惩罚
- HBase上的节俭是否有任何性能基准
- 静态关键字是否提供任何性能提升
- 从抽象类继承的抽象方法是否存在任何性能问题
- 可以使用 char[] 作为参数、返回等来解决任何性能问题
- std::copy 和容器的复制构造函数之间是否存在任何性能差异?
- 包含每个标头是否有任何性能影响
- 直接使用C++WinRT组件或C++XAML项目是否存在任何性能问题
- 使用std::move是否有任何性能上的好处?
- 只有2个元素的元组是否有任何性能损失?
- 为什么我无法通过在 C++11 中运行多个线程来获得任何性能改进?
- signal():任何性能影响
- 通过引用传递自定义类型-任何性能优势