将Char-Array铸造成C 的POD阵列
casting char-array into array of PODs in C++
写下代码的正确方法是什么?
我有一个内存管理器,它为我提供了char *
的s,但是我需要使用uint32_t
的数组。我如何围绕严格的别名规则进行工作?我知道,使用一个对象,建议仅使用memcpy()
复制内容,但是对于一系列对象,该解决方案是不可接受的。
char* ptr = manager()->Allocate(1000 * sizeof(uint32_));
uint32_t* u32ptr = reinterpret_cast<uint32_t*>(ptr);
....
u32ptr[x] = y;
您可以使用位置新:
uint32_t* u32ptr = new(ptr) uint32_t[1000];
请注意,此后,有效的存储类型为uint32_t
,您可能不再使用ptr
。您不必对char
S进行任何特别的事情,因为对于具有琐碎毁灭者的类型,您只需重复使用存储即可结束他们的终生。
您可以使Manager
类返回 std::unique_ptr<void, Manager::Deleter>
(即,带有带有自定义deleter的唯一指针)。这使得分配使用RAII在您脱离范围时自动处理。在这种情况下,您可以编写:
gsl::span
constexpr const length = 1000;
auto allocated = manager()->Allocate(
length * sizeof(std::uint32_t),
alignof(uint32_t) // supporting alignment here is important, otherwise
// you'll have to manually take care of that yourself
);
auto p = gsl::span<uint32_t>(new(allocated.get()) std::uint32_t[length], length);
另一种选择是在元素类型上模板或分配方法模板,并具有 it 照顾事物:
auto p = manager()->Allocate<std::uint32_t>(1000);
...和p
将是 std::unique_ptr<uint32_t>
的CC_11。并不是说您需要他们的任何构造,而是仍然。
警告:在两种情况下,您> 从您所处的范围中返回 p
,因为它是一个非持有的指针,并且内存将是离开范围时释放。p
仅用于本地工作。如果要保持内存不足,则必须返回unique_ptr
。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- OpenMP阵列性能较差
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 位阵列上的快速AND运算
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- 如何在 malloc 内存中初始化非 POD 数据
- C++动态安全 2D 交错阵列
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 将平面阵列重塑为复杂的特征类型
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 库特<<恩德尔;不适用于打印 2D 阵列
- 数组类 阵列的打印输出
- 从较小的阵列到较大的阵列的元素级转换
- 仅在大型阵列上出现合并排序分段错误
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 将Char-Array铸造成C 的POD阵列
- 将char阵列向量施加到POD矢量