编译器为new[]生成的代码,比我想象的要复杂,讨论一下!
<<深入理解C++内存对象模型>>这本书里面说到,编译器为形如
struct s;s* ps=new s[3];
void* operator new(size_t len,void* pCtor, void* pDtor){ void*p=malloc(len); for(int i=0;i<len/sizeof(s);++i){ s* ps=*(p+i); new(ps) s();//构造函数,放置语法 }}
struct s{ s(){printf("ctor\n");} ~s(){printf("dtor\n");} int i,j;};int main(void){ int *pi=new int; int *pj=new int[3]; s* ps=new s; s* pt=new s[4]; return 0;}
s* pt=new s[4];0138107E push 24h 01381080 call operator new[] (13810C5h) 01381085 add esp,4 01381088 mov dword ptr [ebp-10h],eax 0138108B mov dword ptr [ebp-4],0 01381092 test eax,eax 01381094 je main+83h (13810B3h) 01381096 push offset s::~s (1381020h) 0138109B push offset s::s (1381000h) 013810A0 push 4 013810A2 mov dword ptr [eax],4 013810A8 push 8 013810AA add eax,4 013810AD push eax 013810AE call `eh vector constructor iterator' (13810E6h) return 0;013810B3 xor eax,eax
--- No source file -------------------------013810DF int 3 operator new:013810E0 jmp dword ptr [__imp_operator new (13820A0h)] `eh vector constructor iterator':013810E6 push 10h 013810E8 push offset ___rtc_tzz+4 (13821D8h) 013810ED call __SEH_prolog4 (1381550h) 013810F2 xor eax,eax 013810F4 mov dword ptr [ebp-20h],eax 013810F7 mov dword ptr [ebp-4],eax 013810FA mov dword ptr [ebp-1Ch],eax 013810FD mov eax,dword ptr [ebp-1Ch] 01381100 cmp eax,dword ptr [ebp+10h] 01381103 jge `eh vector constructor iterator'+32h (1381118h) 01381105 mov esi,dword ptr [ebp+8] 01381108 mov ecx,esi 0138110A call dword ptr [ebp+14h] 0138110D add esi,dword ptr [ebp+0Ch] 01381110 mov dword ptr [ebp+8],esi 01381113 inc dword ptr [ebp-1Ch] 01381116 jmp `eh vector constructor iterator'+17h (13810FDh) 01381118 mov dword ptr [ebp-20h],1 0138111F mov dword ptr [ebp-4],0FFFFFFFEh 01381126 call $LN9 (1381133h) $LN12:0138112B call __SEH_epilog4 (1381595h) 01381130 ret 14h
01381105 mov esi,dword ptr [ebp+8] ;esi指向了新开数组中的某个元素
01381108 mov ecx,esi ;存入cx, this指针
0138110A call dword ptr [ebp+14h] ;这里调了构造函数
0138110D add esi,dword ptr [ebp+0Ch] ; esi增加,指向下一个元素
01381110 mov dword ptr [ebp+8],esi ;存回堆栈
01381113 inc dword ptr [ebp-1Ch] ;ebp-1Ch加一,表示构造了一个元素
01381116 jmp `eh vector constructor iterator'+17h (13810FDh)
01381118 mov dword ptr [ebp-20h],1 ;第一个跳到这里,表示构造完成
0138111F mov dword ptr [ebp-4],0FFFFFFFEh