1

我想在容器中存储有限数量的项目。我不想使用数组,因为我想避免不必要的对象构造函数调用。std::vector由于隐式调用,我不想使用malloc(我想最小化对堆的访问以获得最大的缓存一致性)。

所以我开始定义自己的自定义容器,如下所示:

template<typename T, size_t capacity> class my_array {
  private:
   char buffer[sizeof(T)*capacity];
   ...
  public:
   T& operator[](size_t i) { return *(T*)&buffer[i*sizeof(A)]; }
   ...
};

但是当我尝试实际使用这个容器时,我会收到关于违反严格别名规则的编译器警告。我已经阅读了严格别名,并且我理解为什么编译器优化会导致上述代码中断。

我该如何解决这个问题?

奇怪的是,我的编译器对我的自定义object_pool类没有任何抱怨,除此之外,我将其用于关联 STL 数据结构的自定义分配器。该类看起来与上面的非常相似(使用 achar[]并执行类似的转换)。我无法弄清楚两者之间的区别是什么。

4

4 回答 4

1

如果你不打算使用std:array那么

char buffer[sizeof(T)*capacity];

应该是

T buffer[capacity]

这就是模板typename首先支持 s 的原因。

于 2013-03-22T00:26:49.877 回答
1

使用std::array . . . . . . . . . . . . . !

于 2013-03-22T00:18:54.200 回答
1

std::aligned_storage如果您不想根据需要初始化对象,请使用std::array。您可能会遇到对齐问题,因为您的结构可能被分配到一个奇数地址。

使用数组作为存储的别名char应该没问题,我不确定你的编译器在做什么。这真的是一个最小的测试用例吗?

于 2013-03-22T00:34:58.480 回答
0

object_pool通过与我在原始帖子中提到的课程进行精确比较,我找到了一个神秘的解决方案。

我换了

T& operator[](size_t i) { return *(T*)&buffer[i*sizeof(A)]; }

T* operator[](size_t i) {
  if (...) {
    return (T*)&buffer[i*sizeof(A)];
  }
  return NULL;
}

我知道...任何谓词总是会计算为true,但编译器不够聪明,无法实现的谓词总是会计算为true

我很好奇是否有人可以在这里准确地解释编译器的想法。我正在使用 gcc 4.4.3。

于 2013-03-22T15:27:01.430 回答