作者cole945 (躂躂..)
看板C_and_CPP
標題Re: [問題] pow(3,3) gcc compile 不需-lm, why
時間Sun May 1 17:16:37 2011
※ 引述《apey ()》之銘言:
: 小弟在linux底下使用gcc的時候, 遇到問題想要請教大家:
: (a).下列這段code編譯需要使用-lm來link libm
: > gcc pow1.c -lm
: (b).承上,這段code卻不需要-lm,請問理由為何?
: printf("%f\n",pow(3,3));
那是因為 gcc 有 把 pow 做成 builtin/intrinsic function,
在編譯期可以知道更多 context 或 type 的資訊,
所以可以針對 special case 先處理掉
(b) 若加上 -fno-builtin 就不能編了
gcc有哪些builtin可以看gcc文件6.51
arch無關的builtin到底會做哪些事可以看source code gcc/builtins.c
舉個Visual C++的builtin memcpy
(default 是關的, 要到C/C++->Optimization->Enable Intrinsic Functions)
int d, s;
char dst[64], src[64];
int len;
考慮這三種 cases, VC 會怎樣處理
1. memcpy (&d, &s, sizeof (d)); copy 4 bytes
2. memcpy (dst, src, sizeof(dst)); copy 64 bytes
3. memcpy (dst, src, len); copy len bytes
1. memcpy (&d, &s, sizeof (d));
mov eax,dword ptr [ebp-4Ch]
mov dword ptr [ebp-58h],eax
case 1 等於是 d = s;
2. memcpy (dst, src, sizeof(dst));
mov ecx,10h
lea esi,[ebp-98h]
lea edi,[ebp-48h]
rep movs dword ptr es:[edi],dword ptr [esi]
case 2 等於是 repeat 16 次 assign 一次 4 byte (共64bytes)
3. memcpy (dst, src, len);
mov ecx,dword ptr [ebp-50h]
push ecx
lea edx,[ebp-98h]
push edx
lea eax,[ebp-48h]
push eax
call memcpy (2F1064h)
add esp,0Ch
case 3 沒救了, 直接用 function call
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.251.226.108
推 loveme00835:XD 05/01 17:22
推 dayyeah:強者 05/01 19:51
推 tomap41017:case 3 XDDDDDDDDDDDDDD 05/01 21:06
→ tomap41017:看不懂也要推XD 05/01 21:06
→ firejox:XDDDDDDDD 05/01 21:12
推 VictorTom:推:) 05/01 22:05
推 xatier:推:) 05/02 08:07
→ apey:太厲害了 05/02 22:17