是在编译器内部做的,而不是在标准库里。
我举一个很简单的例子
structfoo{foo(){}intx;};intmain(){autof=newfoo;}
我们看Clang的中间语言文件, 为了阐述的方便,我编译的时候使用了-fno-exceptions 关闭了异常。
; Function Attrs: norecurse nounwind ssp uwtabledefinei32@main()#0{entry:%f=alloca%struct.foo*,align8%call=calli8*@_Znwm(i644)#3%0=bitcasti8*%callto%struct.foo*callvoid@_ZN3fooC1Ev(%struct.foo*%0)store%struct.foo*%0,%struct.foo**%f,align8reti320}; Function Attrs: nobuiltindeclarenoaliasi8*@_Znwm(i64)#1; Function Attrs: nounwind ssp uwtabledefinelinkonce_odrvoid@_ZN3fooC1Ev(%struct.foo*%this)unnamed_addr#2align2{entry:%this.addr=alloca%struct.foo*,align8store%struct.foo*%this,%struct.foo**%this.addr,align8%this1=load%struct.foo*,%struct.foo**%this.addr,align8callvoid@_ZN3fooC2Ev(%struct.foo*%this1)retvoid}; Function Attrs: nounwind ssp uwtabledefinelinkonce_odrvoid@_ZN3fooC2Ev(%struct.foo*%this)unnamed_addr#2align2{entry:%this.addr=alloca%struct.foo*,align8store%struct.foo*%this,%struct.foo**%this.addr,align8%this1=load%struct.foo*,%struct.foo**%this.addr,align8retvoid}