首页 > 解决方案 > 我可以使用 int(而不是 char)数组作为内存区域,在其中使用新位置创建对象吗?

问题描述

问题涉及一个本土容器模板(一种 std::array/vector 混合),它包含一个用于存储的无类型数组。新元素由 push_back() 成员函数添加,该成员函数通过放置 new 复制构造元素。这样,容器不需要包含的类型具有默认构造函数,并且我们避免了默认构造可能永远不需要的元素。

通常,这样的存储将是像 std::byte 这样的字符类型。

我们正在使用一堆编译器。其中之一早于 C++11 对齐工具,如alignasor aligned_storage。如果没有这一点,它们都需要不同的 pragma 或属性来保证对齐。为了简化构建并避免手动对齐计算噪音,我们想到了使用具有对齐保证的 32 位整数数组。这是实现的核心:

template <class T> struct vec
{
  uint32_t storage[NUM];
  T *freeMem;
  vec() : freeMem((T *)storage) {}
  T *push_back(const T &t) {  return new (freeMem++) T(t); }
};

值得注意的是,我们使用类型化(与存储数组类型不同)指针将存储位置传递给放置 new;我们认为这不是别名违规,因为在创建类型为 T 的对象之前我们不会读取或写入它。

另外值得注意的是,如果 sizeof(T) 不是 sizeof(uint32_t) 的倍数,则新创建的对象可能不完全跨越存储区域中的两个或多个原始 int 对象。

我认为我们既没有别名也没有对象生命周期问题。是这样吗?

标签: c++objectobject-lifetimeplacement-new

解决方案


推荐阅读