将Char-Array铸造成C 的POD阵列

casting char-array into array of PODs in C++

本文关键字:POD 阵列 Char-Array      更新时间:2023-10-16

写下代码的正确方法是什么?

我有一个内存管理器,它为我提供了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