c++ - 我可以使用 int(而不是 char)数组作为内存区域,在其中使用新位置创建对象吗?
问题描述
问题涉及一个本土容器模板(一种 std::array/vector 混合),它包含一个用于存储的无类型数组。新元素由 push_back() 成员函数添加,该成员函数通过放置 new 复制构造元素。这样,容器不需要包含的类型具有默认构造函数,并且我们避免了默认构造可能永远不需要的元素。
通常,这样的存储将是像 std::byte 这样的字符类型。
我们正在使用一堆编译器。其中之一早于 C++11 对齐工具,如alignas
or 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 对象。
我认为我们既没有别名也没有对象生命周期问题。是这样吗?
解决方案
推荐阅读
- ruby-on-rails - Rails sass 编译中的“错误:未定义变量”
- flutter - email_validator 挤压 tefxformfield 颤动
- python - 使用带有匹配颜色条的 plt imshow 绘制一维数组
- mysql - SQL - 使用帖子和类别之间的关系表选择所有类别的逗号分隔值的帖子
- python - 如何将TF1.x中保存的ckpt传输到TF2.x中的模型?
- tensorflow - 如何使用多个 GPU 加速 TensorFlow 推理?
- r - 将预测添加到整洁的模型和绘图中
- rest - Delphi Requests 在 Rest Debugger 中有效,但在 Rest 请求组件中无效
- delphi - 使用资源文件时 Windows 资源管理器中的 exe 图标错误
- spring-boot - Spring Cloud Stream Kafka 发送消息