gpt4 book ai didi

c++ - 物体放置(引用TC++PL第三版10.4.11)

转载 作者:行者123 更新时间:2023-11-30 03:04:09 25 4
gpt4 key购买 nike

class X 
{
public:
X (int);
// ...
};

我们可以通过提供带有额外参数的分配器函数然后在使用 new 时提供此类额外参数来将对象放置在任何地方:

void* operator new(size_t, void *p)       
{
return p;
} // explicit placement operator

void* buf = reinterpret_cast<void*>(0xF00F); // significant address
X*p2 = new(buf)X; //construct an X at ‘buf;’ invokes: operator new(sizeof(X),buf)

这是什么意思?什么是 reinterpret_cast 以及它在这里做什么?广泛解释......

最佳答案

您可以通过两种方式调用operator new .我假设您熟悉的第一种方式:

X *p1 = new X;

通过这种用法,您告诉编译器做两件事:

  1. 分配足够的空间来存储 X 的实例。这是通过调用标准运行时提供的默认分配器来完成的,除非您全局重载了 operator new做一些不同的事情。
  2. 填写 X 的数据成员并通过调用 X 的构造函数之一使其进入已知的初始状态。

现在是 operator new 的第二种形式在您的代码中呈现:

X*p2 = new(buf) X;

通过这种用法,您基本上是在告诉编译器不要为 X 分配空间。而是使用 buf 提供的空间来构造 X 的这个实例。仍然会执行第 2 步,但会执行第 1 步跳过。

reinterpret_cast<void *>这里实质上是告诉编译器地址 0xF00F 处的任何内容,将其视为一些通用数据——没有类型或大小与此数据相关联。这相当于进行原始的 C 风格转换:

void* buf = (void*)0xF00F;

这样做是为了满足 operator new 的函数签名:

void* operator new(size_t, void *p)

注意通用指针 void *p -- 这将采用之前传入的 buf 值。 Actor 在那里是为了让他们的“类型”匹配。另请注意,从技术上讲,0xF00F 不是有效地址,但在本例中我们假设它是有效地址。

这就是上面的代码所做的,并进行了广泛的解释。

关于c++ - 物体放置(引用TC++PL第三版10.4.11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com