2013-11-14 61 views
3

下面的簡單示例代碼和生成的彙編程序。我很驚訝,生成的代碼涉及到變體。特爾斐當然不是。爲什麼TDateTime計算涉及變量?

TDateTime t1; 
TDateTime t2; 
... 
int x = 2 * (t2 - t1); 

生成的代碼。

Unit23.cpp.18: int x = 2 * (t2 - t1); 
00401814 66C745C82400  mov word ptr [ebp-$38],$0024 
0040181A 8D45DC   lea eax,[ebp-$24] 
0040181D E852180000  call $00403074 
00401822 50    push eax 
00401823 FF45D4   inc dword ptr [ebp-$2c] 
00401826 8D55A8   lea edx,[ebp-$58] 
00401829 8D45A0   lea eax,[ebp-$60] 
0040182C E8FB000000  call System::TDateTime::operator -(const System::TDateTime &) 
00401831 DD5D94   fstp qword ptr [ebp-$6c] 
00401834 8D5594   lea edx,[ebp-$6c] 
00401837 8D45EC   lea eax,[ebp-$14] 
0040183A E8F1180000  call $00403130 
0040183F FF45D4   inc dword ptr [ebp-$2c] 
00401842 8D55EC   lea edx,[ebp-$14] 
00401845 B802000000  mov eax,$00000002 
0040184A 59    pop ecx 
*** 
0040184B E808010000  call System::operator *(int,const System::Variant &) 
*** 
00401850 8D45DC   lea eax,[ebp-$24] 
00401853 E8001A0000  call $00403258 
00401858 89459C   mov [ebp-$64],eax 
0040185B FF4DD4   dec dword ptr [ebp-$2c] 
0040185E 8D45DC   lea eax,[ebp-$24] 
00401861 BA02000000  mov edx,$00000002 
00401866 E811190000  call $0040317c 
0040186B FF4DD4   dec dword ptr [ebp-$2c] 
0040186E 8D45EC   lea eax,[ebp-$14] 
00401871 BA02000000  mov edx,$00000002 
00401876 E801190000  call $0040317c 
0040187B 66C745C81800  mov word ptr [ebp-$38],$0018 

回答

5

注意,T2的結果 - t1爲TDateTime類型沒有運營商已經被定義爲INT乘以與TDateTime類型,在這種情況下,編譯器應用不需要的轉換/蒙上。這兩個操作數都被強制轉換爲變而這種全球範圍內運營商被稱爲(左INT):

Variant __fastcall operator *(int lhs, const Variant& rhs) 
{ 
    return Variant(lhs).operator *(rhs); 
} 

我建議你通過specifing操作類型,以防止不必要的類型轉換,因此,你應該改變表達式爲:

int x = 2 * (t2 - t1).Val; 

int x = 2 * (int)(t2 - t1); 

int x = 2 * (t2.Val - t1.Val); // best, minimum assembly is generated