Re: [問題] pow(3,3) gcc compile 不需-lm, why
※ 引述《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
推
05/01 17:22, , 1F
05/01 17:22, 1F
推
05/01 19:51, , 2F
05/01 19:51, 2F
推
05/01 21:06, , 3F
05/01 21:06, 3F
→
05/01 21:06, , 4F
05/01 21:06, 4F
→
05/01 21:12, , 5F
05/01 21:12, 5F
推
05/01 22:05, , 6F
05/01 22:05, 6F
推
05/02 08:07, , 7F
05/02 08:07, 7F
→
05/02 22:17, , 8F
05/02 22:17, 8F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章