14

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

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。

4

3 回答 3

6

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

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

于 2012-07-19T19:43:11.013 回答
4

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

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

这就像使用。

struct PhoneRepoIx {};
Index<PhoneRepoIx> PhoneIndex(1);
list[PhoneIndex.value];
于 2012-07-19T19:31:44.317 回答
4

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

  • 构造函数
  • operator<(因为 STL map 是一个树 impl,所以键应该支持这个)

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

  • 构造函数:一个体面的编译器没有理由不能将其转换为堆栈指针增量(为 int 腾出空间),然后设置可用空间。
  • operator<:一个体面的编译器没有理由不能内联两个对象的“n”之间的简单比较。
于 2012-07-19T19:52:38.137 回答