【发布时间】:2013-03-11 17:33:23
【问题描述】:
我想在一个容器中存储有限数量的项目。我不想使用数组,因为我想避免不必要的对象构造函数调用。我不想使用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 数据结构的自定义分配器。该类看起来与上面的非常相似(使用char[] 并执行类似的转换)。我不知道这两者有什么区别。
【问题讨论】:
-
你不能用
std::array吗?或者std::tr1::array或boost::array你们中没有C++11 支持? -
我没有 c++11 支持。即使我这样做了……我的另一个要求是,出于性能原因,我不想立即实际调用
T的构造函数。我应该提到这个要求,我会编辑我的帖子。
标签: c++ strict-aliasing