读书人

关于new操作符call?2@YAPAXI@Z,该如何

发布时间: 2012-02-19 19:43:37 作者: rapoo

关于new操作符call??2@YAPAXI@Z
用VC6的cl编译以下的源文件

void main()
{
int *p=new int[10];
}

生成的asm文件为:
TITLEnew.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE'
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA'
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST'
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS'
_BSSENDS
_TLSSEGMENT DWORD USE32 PUBLIC 'TLS'
_TLSENDS
FLATGROUP _DATA, CONST, _BSS
ASSUMECS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC_main
EXTRN??2@YAPAXI@Z:NEAR; operator new
_TEXTSEGMENT
_p$ = -4
$T222 = -8
_mainPROC NEAR

; 2 : {

pushebp
movebp, esp
subesp, 8

; 3 : int *p=new int[10];

push40; 00000028H
call??2@YAPAXI@Z; operator new
addesp, 4
movDWORD PTR $T222[ebp], eax
moveax, DWORD PTR $T222[ebp]
movDWORD PTR _p$[ebp], eax

; 4 : }

movesp, ebp
popebp
ret0
_mainENDP
_TEXTENDS
END

我想知道 new操作符的实现(就是那个call??2@YAPAXI@Z)在哪里?它的实现是不是需要操作系统的支持?操作系统在这方面是不是有相应的标准,来为某些计算机语言的操作符提供支持吗?
麻烦大家推荐一些关于这方面的书籍!谢谢!


[解决办法]
关注中
[解决办法]
那个只是一个函数名字而已,你用调试模式,运行程序,切换到汇编代码,进行调试.
[解决办法]
   肯定进行系统调用,让系统给分配内存.凡是涉及硬件操作,都是调用操作系统的函数去实现.计算机语言的操作符是设计语言的人规定的,如果这个操作符涉及到硬件操作,那么这种语言不提供实现方式,而是编译的时候让编译器连接系统提供的函数,实现此功能.比如C中的malloc函数,在linux和windows中连接执行的代码是不一样的,因为两种系统提供不同的堆分配代码.
[解决办法]

C/C++ code
void  main() { 004117A0  push        ebp  004117A1  mov         ebp,esp 004117A3  sub         esp,0D8h 004117A9  push        ebx  004117AA  push        esi  004117AB  push        edi  004117AC  lea         edi,[ebp-0D8h] 004117B2  mov         ecx,36h 004117B7  mov         eax,0CCCCCCCCh 004117BC  rep stos    dword ptr es:[edi]     int *p=new  int[10]; 004117BE  push        28h  004117C0  call        operator new (4111D6h) 004117C5  add         esp,4 004117C8  mov         dword ptr [ebp-0D4h],eax 004117CE  mov         eax,dword ptr [ebp-0D4h] 004117D4  mov         dword ptr [p],eax } 004117D7  xor         eax,eax 004117D9  pop         edi  004117DA  pop         esi  004117DB  pop         ebx  004117DC  add         esp,0D8h 004117E2  cmp         ebp,esp 004117E4  call        @ILT+455(__RTC_CheckEsp) (4111CCh) 004117E9  mov         esp,ebp 004117EB  pop         ebp  004117EC  ret
[解决办法]
new 就是个运算符,跟进去的代码你可以自己看,给你贴一点

C/C++ code
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)        {       // try to allocate size bytes10269080  push        ebp  10269081  mov         ebp,esp 10269083  sub         esp,10h         void *p;        while ((p = malloc(size)) == 0)10269086  mov         eax,dword ptr [size] 10269089  push        eax  1026908A  call        malloc (1021AB10h) 1026908F  add         esp,4 10269092  mov         dword ptr [p],eax 10269095  cmp         dword ptr [p],0 10269099  jne         operator new+77h (102690F7h)
[解决办法]
编译器根据规则生成的符号
[解决办法]
编译器生成的名字,一般不去理会

读书人网 >C++

热点推荐