我正在經歷strlen for glibc的來源。他們使用magic bits
來查找字符串的長度。有人可以解釋它是如何工作的。 謝謝魔術比特如何改善glibc中的strlen函數
回答
比方說,這個功能是通過尋找一個字符串 - 一次4個字節,由註釋解釋(我們假設long ints
是4個字節) - 與當前「塊」這個樣子:
'\3' '\3' '\0' '\3'
00000011 00000011 00000000 00000011 (as a string: "\x03\x03\x00\x03")
strlen函數只是尋找這個字符串中的第一個零字節。它首先確定,對於每個4字節塊,是否有任何零字節在那裏,首先檢查該magic_bits
快捷方式:它增加了的4個字節爲這個值:
01111110 11111110 11111110 11111111
添加任何非零字節到這個值將導致1通過傳播載體而溢出到由零標記的孔中。對於我們的塊,它會是這樣的:
11111111 111111 1 1111111 Carries
00000011 00000011 00000000 00000011 Chunk
01111110 11111110 11111110 11111111 Magic bits
+ -----------------------------------
10000010 00000001 11111111 00000010
^ ^ ^ ^
(孔位由^
的標記)
,並從評論:
/* Look at only the hole bits. If any of the hole bits
are unchanged, most likely one of the bytes was a
zero. */
如果沒有零中的所有洞位將被設置爲1
's。但是,由於零字節,一個孔位沒有被傳播進位填充,我們可以檢查它是哪個字節。
本質上,它通過在4個字節塊上應用一些位加法魔術來掃描零來加速strlen計算,然後將搜索範圍縮小到單個字節比較。
的想法是不是一個字節在對零的時間比較,而在一次檢查一個unsigned long
對象,如果它的字節之一是零。這意味着當sizeof (unsigned long)
爲8
時,檢查8
字節。
隨着位的攻擊,有一個快速已知的表達式,可以確定其中一個字節比較是否等於零。然後,如果其中一個字節等於零,則單獨測試對象的字節以找到第一個爲零的字節。使用按位操作的優點是減少了分支指令的數量。
位劈表達,以檢查是否一個多字節對象的字節之一等於零在著名的斯坦福位操作黑客頁進行了解釋,在
確定一個字具有零字節 http://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord
所以[glibc](http://tsunanet.net/~tsuna/strlen.c.html)的實現比[libc]快(https://www.student.cs.uwaterloo.ca/~ cs350/common/os161-src-html/strlen_8c-source.html)的實現? – Aakashdeep
@Aakashdeep - 這也取決於你的字符串有多長。有一個設置魔術的投資。這多少回報? –
- 1. 魔術函數__call()函數?
- 2. 魔術sprintf函數 - 如何包裝它?
- 3. 圖形魔術長寬比
- 4. Python中的特殊(魔術)方法
- 5. __call()魔術函數如何在PHP中正確工作?
- 6. 如何在IPython中重命名一個魔術函數?
- 7. 如何改善正弦/餘弦函數?
- 8. 如何使用xaml魔術
- 9. 更改IPython魔術函數前綴(從'%'到':'),反正呢?
- 10. c中的strlen函數
- 11. 如何擺脫魔術數字背景
- 12. 改善構造函數
- 13. 數組中的魔術數字? - C++
- 14. 魔術在Java中
- 15. 更改魔術列的時間戳(Rails)
- 16. 在Django的shell中,我如何自動加載ipython的魔術函數?
- 17. JavaScript中的魔術方法
- 18. UIScrollview ContentSize魔術
- 19. Html.ActionLink魔術
- 20. 魔術爲bool
- 21. 左移魔術
- 22. 實現魔術
- 23. 的CSS列魔術
- 24. uwsgi vassal魔術變數
- 25. 一輪浮點數魔術
- 26. 改善圖像對比度
- 27. IPython的魔術%paste如何工作?
- 28. 改善散列函數值的分佈
- 29. 構造函數無魔術字符串的參數
- 30. lambda函數參數+扣改善
'24-30位清零並且位31置位時發生一次失火;'你能解釋什麼是失火? – yuan
@張元:當魔法測試*認爲*有'0'字節時,快捷方式「失誤」,但沒有。顯然這與其中一個值是'\ x80'或其他相關。 – Lynn