gpt4 book ai didi

c++ - placement new zero 会占用内存吗?

转载 作者:太空狗 更新时间:2023-10-29 20:45:34 27 4
gpt4 key购买 nike

我有以下代码:

struct foo {};
void bar(foo *d) {
new(d) foo(*d);
}

表达式 new(d) foo(*d) 是否保持 d 指向的对象不变?更具体地说,如果类 foo 和其中递归包含的所有对象只有普通的复制构造函数,那么上面的内容是否为 new(d) foo(*d)保持 *d 不变?可能不是这样的情况是,new 在调用复制构造函数之前首先将内存清零。 C++语言中有这样的子句吗?

编辑:有人想要这样做的原因并不简单。考虑跨地址空间复制对象,例如,从 CPU 内存到 GPU 内存。一种解决方案是逐字节处理对象。这在很多情况下都有效。如果该类有虚方法,则逐字节复制会复制 vtable 指针,然后指向一些 CPU 内存。可以在对象上使用上面的表达式 new(d) foo(*d) 来强制编译器重置 vtable 指针。

最佳答案

关于 placement new 是否将内存清零,它不会,它只是调用适当的构造函数,该构造函数将执行该构造函数所做的任何事情,这可能会将内存清零,具体取决于它的定义方式。在这种特殊情况下,您使用的是复制构造函数

就您提供的代码而言,这是未定义的行为。 d 要么指向有效对象,要么不指向。如果它引用一个有效对象,则您正在对已构造的对象调用构造函数,如果该对象具有非平凡的析构函数,则这是未定义的行为。如果它之前没有被初始化(即它不引用 foo 对象),那么从它复制是未定义的行为。

关于c++ - placement new zero 会占用内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490191/

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