看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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