我有這個C++它創建了兩個派生的對象,然後調用虛函數調用很多次:編譯器是否優化了虛擬調用?
Parent* d;
Child1 d1[1];
Child2 d2[1];
if(__rdtsc() & 1 != 0){
d = d1;
}
else{
d = d2;
}
for(unsigned long long i =0; i<9000000000; ++i){
sum += d->process2();
}
和它產生的這種彙編:基於彙編可能有人請確認
for(unsigned long long i =0; i<9000000000; ++i){
000000013F4241A5 mov qword ptr [rsp+100h],0
000000013F4241B1 jmp main+2B6h (013F4241C6h)
000000013F4241B3 mov rax,qword ptr [rsp+100h]
000000013F4241BB inc rax
000000013F4241BE mov qword ptr [rsp+100h],rax
000000013F4241C6 mov rax,218711A00h
000000013F4241D0 cmp qword ptr [rsp+100h],rax
000000013F4241D8 jae main+306h (013F424216h)
sum += d->process2();
000000013F4241DA mov rax,qword ptr [rsp+0F8h]
000000013F4241E2 mov rax,qword ptr [rax]
000000013F4241E5 mov rcx,qword ptr [rsp+0F8h]
000000013F4241ED call qword ptr [rax+8]
000000013F4241F0 mov qword ptr [rsp+1D8h],rax
000000013F4241F8 mov rax,qword ptr [rsp+1D8h]
000000013F424200 mov rcx,qword ptr [sum (013F4385D8h)]
000000013F424207 add rcx,rax
000000013F42420A mov rax,rcx
000000013F42420D mov qword ptr [sum (013F4385D8h)],rax
}
編譯器無法優化循環中的虛擬調用(即使每次迭代都調用相同的派生對象),因爲編譯器不可能知道是否選擇了d1
或d2
,這是因爲對__rdtsc()
的調用只能在運行時解析?
(如果有人可以給我一些建議如何閱讀彙編程序的d->process2()
調用這將是最欣賞的)
該代碼看起來並沒有得到優化?你打開優化了嗎? – Mysticial
/O2已啓用。 – user997112
剛打開/ 03,完整的程序優化和優先碼速度 - >相同的輸出。 – user997112