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. VC编程命名方法

    1.

  2. javascript数组方法鉴赏一

    创建数组 如果你习惯了用 new 来实例化对象的形式,那么在js中一定会疑惑,可选的参数数量代表的意义截然不同. new Array(size);//传一个参数的时候分两种情况,size是正整数时代表 ...

  3. 调查程序phpquestionnaire 2.2中文安装注意

    最近找调查投票软件 找到limesurvey 和 phpquestionnaire,limesurvey 中文可以用,但是比较烦琐.phpquestionnaire有汉化过的包下载,但是安装完,发现中 ...

  4. 递归:汉诺塔 - 零基础入门学习Python024

    递归:汉诺塔 让编程改变世界 Change the world by program 似乎谈到递归算法就要拿汉诺塔来举例,没办法,因为小甲鱼小时候太笨了,这个游戏老是玩不过关,好不容易在自学编程的时候 ...

  5. MHA环境的搭建

    MHA简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开 ...

  6. itunes一进store就提示已停止工作该怎么解决

    改兼容,换盘重装什么的都试过了没用,可以听歌更新软件更改账号,但是就是进不了store,每次都是这个进度就卡死了. 问题事件名称: APPCRASH 应用程序名: iTunes.exe 应用程序版本: ...

  7. VS2010的调试参数/Zi /DEBUG

    /DEBUG只是是否要生成调试信息的开关.这个命令行选项在链接器页面那里 /Zi只是生成的调试信息的格式,这个格式是.pdb文件.当然还有好几种格式.这个命令行在编译页那里 如果上面的选项没有设置对, ...

  8. haporxy 负载elasticsearch

    <pre name="code" class="html">-bash-4.1# cat /etc/haproxy/haproxy.cfg glob ...

  9. hdu 5432 Pyramid Split(二分搜索)

    Problem Description Xiao Ming is a citizen who's good at playing,he has lot's of gold cones which ha ...

  10. python list 中找连续的数字(由网友处学习)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #学习这个要求的:http://wsky.org/archives/ ...