我刚刚学习了名为"placement new"的C++结构.它允许您精确控制指针指向内存的位置.它看起来像这样:
#include <new> // Must #include this to use "placement new"
#include "Fred.h" // Declaration of class Fred
void someCode()
{
char memory[sizeof(Fred)];
void* place = memory;
Fred* f = new(place) Fred(); // Create a pointer to a Fred(),
// stored at "place"
// The pointers f and place will be equal
...
}
Run Code Online (Sandbox Code Playgroud)
(来自C++ FAQ Lite的
例子)在这个例子中,thisFred 的指针将等于place.
我已经看到它在我们团队的代码中使用过一次或两次.根据您的经验,这个构造能够实现什么?其他指针语言是否有类似的结构?对我来说,它似乎让人联想equivalence到FORTRAN,它允许不同的变量占据内存中的相同位置.
我们正在trivially_copiable从辅助存储中初始化(大型)对象数组,诸如此类的问题使我们对所实现的方法缺乏信心。
下面是一个最小的示例,试图说明代码中“令人担忧”的部分。也请在 Godbolt 上找到它。
让我们有一个trivially_copyable但不是default_constructible用户类型:
struct Foo
{
Foo(double a, double b) :
alpha{a},
beta{b}
{}
double alpha;
double beta;
};
Run Code Online (Sandbox Code Playgroud)
信任cppreference:
不存在潜在重叠子对象的普通可复制类型的对象是唯一可以使用 std::memcpy 安全复制或使用 std::ofstream::write()/std::ifstream 与二进制文件序列化的 C++ 对象::读()。
现在,我们想要将二进制文件读入动态数组中Foo。由于Foo不可默认构造,我们不能简单地:
std::unique_ptr<Foo[]> invalid{new Foo[dynamicSize]}; // Error, no default ctor
Run Code Online (Sandbox Code Playgroud)
使用未初始化的unsigned char数组作为存储。
std::unique_ptr<unsigned char[]> storage{
new unsigned char[dynamicSize * sizeof(Foo)] };
input.read(reinterpret_cast<char *>(storage.get()), dynamicSize * sizeof(Foo));
std::cout << reinterpret_cast<Foo *>(storage.get())[index].alpha …Run Code Online (Sandbox Code Playgroud)