问题标签 [placement-new]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
394 浏览

c++ - 重载placement new 运算符的额外成本是多少?

我们想要重载placement new 操作符,只是为了验证使用的内存大小对于给定的类是否足够。我们知道这个尺寸。构造或多或少是这样的:

假设在这种简化的上下文中使用:

在测试阶段,我使用了这个 PlacementNewTest<> 类,但在发布代码中我考虑将其删除。你认为,根据你的经验,如果不删除这个额外的测试类,这将花费我们多少性能?这是验证的唯一成本if (size > MAXSIZE)吗?换句话说,这种重新定义的性能损失是多少:

也许这在这个问题上并不重要——但是:这是而且必须是 C++03。我们无法升级到 C++11。而 boost 也不是一个选项,只有 C++03。

0 投票
5 回答
6938 浏览

c++ - 使用placement new操作符时我真的需要担心对齐吗?

我读了这篇文章 我什么时候应该担心对齐?但我仍然不知道我是否必须担心放置 new 运算符返回的未对齐指针 - 就像在这个例子中一样:

__alignof(A) == 4,(buffer + 1)不与 对齐4。但一切正常 - 完整的例子在这里:http: //ideone.com/jBrk8

如果这取决于架构,那么我正在使用:linux/powerpc/g++ 4.xx

[更新]在发布这个问题后,我读了这篇文章:http: //virtrev.blogspot.de/2010/09/memory-alignment-theory-and-c-examples.html。也许在我的情况下唯一的缺点是性能损失,我的意思是未对齐的访问成本超过对齐?

0 投票
1 回答
931 浏览

c++ - C ++:放置新的与自己的新重载发生冲突

我已经为一种类型重载了 new 运算符X以使用一些内存池。我的new运算符不接受用户定义的参数,因此,唯一的参数是 type 对象的大小size_t。在程序的另一部分,我需要为同一类型放置新的位置,如下所示:

(其中 ptr 是指向预分配内存位置的指针)

似乎我对新类型阴影放置新的新运算符的重载。至少,编译器抱怨:

候选人是我对 new 运算符的重载。我的问题是:

  • 为什么编译器不能识别我想使用placement new?
  • 无论如何,我该如何使用它?
  • WTF 是X*&错误信息中显示的类型?
0 投票
1 回答
1839 浏览

c++ - C++ 放置新的“构造函数”的多个参数

为了进行一些自定义内存跟踪(泄漏预防、损坏检测),我不得不使用placement new 来创建C++ 对象,它工作得很好——但我正在努力弄清楚如何将参数传递给构造函数,因为它是从宏中调用的(因此可以自动提供文件+行)。

功能:

这是通过宏调用的:

放置新:

va_list 宏将涵盖可变参数数量的扩展,只是我不想提供构造函数具有的参数数量,删除 va_arg(),并且不能使用 va_start(),因为它需要一种格式。

这让我有点不知所措:http ://www.drdobbs.com/cpp/calling-constructors-with-placement-new/232901023?pgno=2

有什么方法可以__VA_ARGS__从 new_object 使用并将它们传递给构造函数?每个对象只有一个构造函数,但有许多不同类型的对象采用不同的参数,所以我想尽可能多地去除手动维护。

还是有更好的方法来做我正在尝试的事情!

0 投票
2 回答
2252 浏览

c++ - 可以使用placement-new 和vector::data() 替换向量中的元素吗?

关于替换不可赋值的向量元素存在两个问题:

一个对象不可赋值的一个典型原因是它的类定义包括const成员,因此它operator=被删除了。

std::vector要求其元素类型是可分配的。事实上,至少使用 GCC,当对象不可赋值时,直接赋值 ( vec[i] = x;)erase()insert()替换元素的组合都不起作用。

像下面这样使用vector::data()复制构造函数的直接元素销毁和放置 new 的函数是否可以用于替换元素而不会导致未定义的行为?

下面是一个正在使用的函数的示例。这在 GCC 4.7 中编译并且似乎可以工作。

0 投票
1 回答
972 浏览

c++ - 为什么操作员新功能 - 放置形式在班级级别可以?

我们从 c++ 11(在 c++98/03 标准中也是如此)标准中知道(见下文),我们不能尝试替换 operator new 函数 - 全局空间中的放置形式,因为它已经定义。

18.6.1.3 安置表格 [new.delete.placement]

这些函数是保留的,C++ 程序可能不会定义取代标准 C++ 库 (17.6.4) 中的版本的函数。(3.7.4) 的规定不适用于 operator new 和 operator delete 的这些保留放置形式。

下面的代码片段中的第 2 点已经证明了这一点,按预期编译错误。

但是我仍然可以覆盖类级别中的新位置,效果很好,请参见下面片段中的第 (2) 点。这是为什么?不应该编译应该尽量防止(2)以及根据标准???

请参阅下面的我的片段:

以下是预期的输出:

==================================================== ================================= 进一步澄清我的问题:

18.6.1.3 放置形式这些函数是保留的,C++ 程序不能定义替换 标准C++ 库 (17.6.4) 中的版本的函数。(3.7.4) 的规定不适用于这些保留的安置表格

运算符 new 和运算符 delete。

这解释了我的代码片段中 <2> 点处的预期编译错误,所以这个没问题。

但是为什么我可以在班级说明中的第(2)点取代班级级别的安置表格?

0 投票
1 回答
396 浏览

c++ - 将 sizeof 和 Placement new 结合起来是否安全?

考虑以下类:

现在我知道这有问题,但是为了使代码简短以便讨论,我们将假设 defer::construct() 总是在对象超出范围之前调用。

话虽如此,这样做是否总是安全的?或者在具有其他疯狂的多重虚拟继承的一些奇怪的极端情况下,std::uint8_t[sizeof(T)] 可以不分配足够的空间吗?

0 投票
2 回答
714 浏览

c++ - Is move assignment via destruct+move construct safe?

Here's a very easy way to define move assignment for most any class with a move constructor:

Is this sequence of calling your own destructor followed by placement new on the this pointer safe in standard C++11?

0 投票
2 回答
161 浏览

c++ - 创建独立于构造函数参数的对象指针

我正在尝试创建一个类似于容器 Vector 的向量。

然后声明:

在分配内存时,它会给出 A 没有默认构造函数的编译错误。我编写了以下代码来分配内存。

T 是一个模板变量。

该错误是由于在放置 new 时我使用了 T 的默认构造函数,而我没有为 A 编写默认构造函数。

我想知道,有没有办法让内存分配不依赖于构造函数签名。

0 投票
1 回答
157 浏览

c++ - 递归布局分配

是否可以进行递归布局分配?
如果我有这门课:

我想在特定的缓冲区上动态分配它,我希望 m_field2 将在该缓冲区上分配太多,我将在“A”中定义的每个对象也是如此。
可以做到吗?