二進制求和沒什麼可說的,就是一個很簡單的相加,跟加一那道題的做法基本一致(準確來說就是完全一致)。之所以提一下,是因爲今天第一次遇到內存泄漏……之前寫的基本是有自動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比百度不知道高到哪裏去了。