c++ - 绕过 C++ 严格别名规则

标签 c++ strict-aliasing

我想在容器中存储有限数量的项目。我不想使用数组,因为我想避免不必要的对象构造函数调用。我不想使用 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 . . . . . . . . . . . . . !

关于c++ - 绕过 C++ 严格别名规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15560548/

相关文章:

c++ - gdb 没有通过指令 -l 显示正确的源代码

c++ - 将 int 放入 char 数组中是否需要放置 new 合法?

c - GCC 和相同类型数组之间的严格别名

c++ - 第二个reinterpret_cast和严格别名

C++ 简单文件读取

Obj-c.h 函数原型(prototype)中需要 C++ 结构

c++ - 原子线程栅栏 : Why is there a data race on this non atomic variable? 这有关系吗?

c++ - 在 C++ 中捕获 lambda 的全局引用是否会抑制别名优化?

c - gcc 优化跳过初始化分配的内存

c++ - 如何将 "Bind"数字转换为一串单词/短语,以便我可以在循环中调用它?