二進制求和和x的平方根

二進制求和沒什麼可說的,就是一個很簡單的相加,跟加一那道題的做法基本一致(準確來說就是完全一致)。之所以提一下,是因爲今天第一次遇到內存泄漏……之前寫的基本是有自動GC和內存管理的語言(比如Java),看到內存泄漏居然覺得有點新奇(?)

線上跑的時候報錯是這樣的:

AddressSanitizer: heap-buffer-overflow on address 0x608000000202 at pc 0x0000004069a5 bp 0x7ffc361a2e10 sp 0x7ffc361a2e08

然後是一長串堆裏的東西。然後我在本地用GCC運行會報錯:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

後來發現是自己寫錯了,但是就算寫錯了,這個字符串也不過200個字符而已……這就內存不足了?

至於求平方根這個,也沒什麼可說的,是一個很傳統的牛頓迭代法。但是我想說的是,在調用庫裏自帶的sqrt函數然後強轉的時候,發現了一個很有意思的事:static_cast似乎比直接強轉要慢。因爲使用int(sqrt(x))的時候是0ms,而使用static_cast(sqrt(x))的時候是4ms。並且這不是偶然現象,我運行了多次,是一個穩定的結果。

雖然說從道理上說得通,static_cast爲了安全性可能會犧牲一些性能,但是並沒有什麼證據。並且,我通過VS看到的彙編代碼也是一樣的,除了地址不同:

; int(sqrt(x))
0076193D  mov         eax,dword ptr [x]  
00761940  push        eax  
00761941  call        sqrt<int,void> (076130Ch)  
00761946  add         esp,4  
00761949  fstp        qword ptr [ebp-0D4h]  
0076194F  movsd       xmm0,mmword ptr [ebp-0D4h]  
00761957  cvttsd2si   eax,xmm0
; static_cast(sqrt(x))
008E193D  mov         eax,dword ptr [x]  
008E1940  push        eax  
008E1941  call        sqrt<int,void> (08E130Ch)  
008E1946  add         esp,4  
008E1949  fstp        qword ptr [ebp-0D4h]  
008E194F  movsd       xmm0,mmword ptr [ebp-0D4h]  
008E1957  cvttsd2si   eax,xmm0

難道真的是偶然情況?

哦,最後補充一點,bing比百度不知道高到哪裏去了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章