placement operator new是重载的operator new运算符,它允许我们将对象放到一个指定的内存中。下面来看c++源码:

class X {
private:
int _x;
public:
X(int xx = ) : _x(xx) {}
~X() {}
void* operator new(size_t n, void* location) {
return location;
}
}; int main() {
int i;
X* xp = new (&i) X;//placement operator new的语法
};

下面是main函数里面的汇编码:

int i;
: X* xp = new (&i) X;
013913AE lea eax,[i] ;将i的地址给寄存器eax
013913B1 push eax ;压栈eax,作为参数传递给operator new,即传递参数loc
013913B2 push ;压栈内存大小4,即传递参数size_t 由编译器算出
013913B4 call X::operator new (13910FAh) ;调用operator new
013913B9 add esp, ;栈顶指针-8,释放调用operator new而传参时分配的栈空间
013913BC mov dword ptr [ebp-0E0h],eax ;eax保存operator new的返回值,即内存空间的首地址
;这里是变量i的地址 ,将此地址存入ebp-0E0h所代表的内存
013913C2 cmp dword ptr [ebp-0E0h], ;将ebp-0E0h内存里面的值与0做比较,判断是否为空指针
013913C9 je main+50h (13913E0h) ;如果为空,就跳转到地址13913E0h处执行,否则,顺序执行
;这里顺序执行
013913CB push ;压入参数0,为调用构造函数传递参数
013913CD mov ecx,dword ptr [ebp-0E0h] ;将 ebp-0E0h内存中的值(变量i的地址)给寄存器ecx
;作为隐含参数(即this指针)传递给构造函数
013913D3 call X::X (1391041h);调用构造函数
013913D8 mov dword ptr [ebp-0E8h],eax ;寄存器eax存有对象首地址(即变量i的地址),将eax的值给ebp-0E8h所代表的内存
013913DE jmp main+5Ah (13913EAh) ;跳转到地址13913EAh处执行
013913E0 mov dword ptr [ebp-0E8h], ;这一条指令是013913C2 处判断失败后将要执行的指令
;将0给ebp-0E8h所代表的内存
013913EA mov ecx,dword ptr [ebp-0E8h] ;将ebp-0E8h内存的值给寄存器ecx
013913F0 mov dword ptr [xp],ecx ;ecx的值(对象首地址)给指针变量xp
: };

从汇编码可以看到,首先调用重载之后的placement operator new运算符,它仅仅返回的是变量i的地址。接下来,编译器将这个地址作为所要构造对象的首地址,作为this指针传给了构造函数,进行构造函数的调用。最后,将对象首地址(也就是变量i的地址)给了指针变量xp,从而在变量i处的内存中构造了一个对象。

需要注意的是如果类X所占用的内存比一个int i大,那么,在这种情况下构造的时候,将引起程序崩溃。

从汇编看c++中的placement operator new的更多相关文章

  1. 从汇编看c++中指向成员变量的指针(二)

    在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream& ...

  2. 从汇编看c++中成员函数指针(一)

    下面先来看c++的源码: #include <cstdio> using namespace std; class X { public: int get1() { ; } virtual ...

  3. 从汇编看c++中指向成员变量的指针(一)

    在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...

  4. 从汇编看c++中的虚拟继承及内存布局(二)

    下面是c++源码: class Top {//虚基类 public: int i; Top(int ii) { i = ii; } virtual int getTop() { cout <&l ...

  5. 从汇编看c++中的多态

    http://www.cnblogs.com/chaoguo1234/archive/2013/05/19/3079078.html 在c++中,当一个类含有虚函数的时候,类就具有了多态性.构造函数的 ...

  6. 从汇编看c++中临时对象的析构时机

    http://www.cnblogs.com/chaoguo1234/archive/2013/05/12/3074425.html c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...

  7. 从汇编看c++中含有虚基类对象的析构

    c++中,当继承结构中含有虚基类时,在构造对象时编译器会通过将一个标志位置1(表示调用虚基类构造函数),或者置0(表示不调用虚基类构造函数)来防止重复构造虚基类子对象.如下图菱形结构所示: 当构造类B ...

  8. 从汇编看c++中全局对象和全局变量

    先来看c++源码: #include <iostream> using namespace std; class X { public: int i; public: X() : i(ii ...

  9. 从汇编看c++成员函数指针(三)

    前面的从汇编看c++中成员函数指针(一)和从汇编看c++成员函数指针(二)讨论的要么是单一类,要么是普通的多重继承,没有讨论虚拟继承,下面就来看一看,当引入虚拟继承之后,成员函数指针会有什么变化. 下 ...

随机推荐

  1. js delete 用法

    1,对象属性删除   function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delet ...

  2. python3.4入门——核心数据类型

    变量.对象和引用 变量的创建:一个变量(即变量名,如a),当代码第一次给它赋值就创建了它. 变量类型:变量没有任何和它关联的类型信息约束.类型的概念存在于对象中,而不是变量名中.变量原本是通用的,只是 ...

  3. 无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法

    无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法,需要的朋友可以参考下 在Windows Server2008 R2中的IIS7中部署WCF服务时报出如题错误: HT ...

  4. NSRunLoop 详解

    今天看到了NSRunloop,其实之前也有看了关于NSRunloop的内容,在这里想简单的就个人的理解总结一下.其实自己在开发的过程当中,还没有更多的涉及到NSRunloop的功能.总的来说,NSRu ...

  5. POJ 2653 Pick-up sticks(线段相交)

    题意:给定n个木棍依次放下,要求最终判断没被覆盖的木棍是哪些. 思路:快速排斥以及跨立实验可以判断线段相交. #include<algorithm> #include<cstdio& ...

  6. Jquery 概念性内容编辑器

      概念性jQuery内容编辑器,这是一款非常有特色的jQuery编辑器,该编辑器支持文字.列表.视频.引用等功能,是一款小巧简洁,富有个性化的jQuery内容编辑器插件. 代码: <!doct ...

  7. Reverse Nodes in k-Group 解答

    Question Given a linked list, reverse the nodes of a linked list k at a time and return its modified ...

  8. postgresql C/C++ API 接口

    1,postgresql学习uri推荐 http://www.php100.com/manual/PostgreSQL8/ http://www.php100.com/manual/PostgreSQ ...

  9. JAX-WS 可运行项目

    该项目是通过JAX-WS实现的WebService服务,其中包括了1.关于最简单的WebService服务的创建2.关于文件交互的WebService的创建 代码中包括了服务端代码和客户端代码(客户端 ...

  10. JQuery 选择器 *很重要 多记

    1)基本选择器: 跟CSS选择器类似 2) 层次选择器 div>span   紧接这div同一级下的全部span .one+div     同一等级的div #two~div    同一等级di ...