当前位置:  开发笔记 > 编程语言 > 正文

什么是C++构造"放置新"的用途?

如何解决《什么是C++构造"放置新"的用途?》经验,为你挑选了5个好方法。

我刚刚学习了名为"placement new"的C++结构.它允许您精确控制指针指向内存的位置.它看起来像这样:

 #include         // 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

   ...
 } 

(来自C++ FAQ Lite的

例子)在这个例子中,thisFred 的指针将等于place.


我已经看到它在我们团队的代码中使用过一次或两次.根据您的经验,这个构造能够实现什么?其他指针语言是否有类似的结构?对我来说,它似乎让人联想equivalence到FORTRAN,它允许不同的变量占据内存中的相同位置.



1> David Thornl..:

它允许您进行自己的内存管理.通常情况下,这会让你的性能略有提升,但有时这是一个很大的胜利.例如,如果您的程序使用大量标准大小的对象,您可能希望创建一个具有一个大内存分配的池.

这种事情也在C中完成,但由于C中没有构造函数,因此不需要任何语言支持.



2> Nemanja Trif..:

它还用于嵌入式编程,其中IO设备通常映射到特定的存储器地址



3> Greg Rogers..:

我在共享内存段中构造对象时使用过它.



4> Martin York..:

在构建像对象一样的容器时,它非常有用.

例如,如果您要创建矢量.如果为大量对象保留空间,则需要使用一些不调用对象构造函数的方法来分配内存(如new char [sizeof(object)*reserveSize]).然后,当人们开始将对象添加到向量中时,您可以使用placement new将它们复制到已分配的内存中.

template
class SillyVectorExample
{
    public:
        SillyVectorExample()
            :reserved(10)
            ,size(0)
            ,data(new char[sizeof(T) * reserved])
        {}
        void push_back(T const& object)
        {
            if (size >= reserved)
            {
                // Do Somthing.
            }
            // Place a copy of the object into the data store.
            new (data+(sizeof(T)*size))  T(object);
            ++size;
        }
        // Add other methods to make sure data is copied and dealllocated correctly.
    private:
        size_t   reserved;
        size_t   size;
        char*    data;
 };

PS.我不是在鼓吹这样做.这只是容器如何工作的简化示例.



5> James Hopkin..:

Placement new可用于创建类型安全的联合,例如Boost variant.

union类包含一个缓冲区,它与指定包含的最大类型(并且具有足够的对齐)一样大.它new根据需要将对象放入缓冲区.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有