似乎在64位平臺上有一個8字節長度的前綴是合理的。如果我們可以解決超過4Gb的mem,爲什麼不允許使用5Gb字符串?答案僅僅是「通過規範」,還是存在一些我不知道的互操作性/向後兼容性原因? 謝謝。爲什麼64位平臺上的BSTR長度前綴爲4個字節?
1
A
回答
6
BSTR
數據類型是標準的COM字符串數據類型。改變長度前綴將使得不可能在不同位數的進程之間安全地移動字符串(或者至少使其顯得更復雜)。由於COM是唯一相關的跨位互操作性基礎結構,因此對於32位進程和64位進程,必須具有相同的行爲方式BSTR
。
這是一個折衷,強加了一個2GB的「限制」,以換取不同位數的進程之間的無干擾字符串編組交換。
1
http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069%28v=vs.85%29.aspx
BSTR是一個前綴長度的字符串,所以第一個屬性是是長度,沒有解決
大多數64位編譯實現使用LP64(的Linux/Unix)或LLP64(視窗),所以INT的長度保持32位
另一個原因也許向後兼容性
+0
我編輯了這個問題。我問的是爲什麼沒有size_t而不是4字節的int。 –
5
一個很好的理由是用於與平臺API,其接受int
LEN兼容性等MultiByteToWideChar
gths。還有更多的字符串API可以使用32位長度。
這實際上並不是一個真正的限制,因爲我無法想象長度> 2GB的BSTR
將是解決問題的最佳方案。
相關問題
- 1. 爲什麼64位地址的前4個字節打印爲0x00000001?
- 2. 爲什麼在Windows 64位平臺上void指針的大小是4
- 3. 爲什麼visual studio在64位平臺上鍊接MSVCR90.dll(x86)?
- 4. 編程爲64位平臺
- 5. 爲什麼字符串的字節長度比長度長?
- 6. 64位平臺中的4字節指針?
- 7. 爲什麼C#/ .Net字符串長度前綴和空終止?
- 8. 爲什麼Rust/sodiumdioxide PublicKeys在序列化時會以前綴長度爲前綴?
- 9. Python字符串前綴4字節長度
- 10. 前綴長度值爲0
- 11. 爲什麼jvm使用4個字節來保存64位env中的引用?
- 12. 什麼是以字節爲單位的base64長度?
- 13. 將int寫入字節,長度爲4
- 14. 爲什麼Autoprefixer不會爲字體平滑添加前綴
- 15. 爲什麼gdb告訴我一個指針在x86-64上是4個字節?
- 16. 爲什麼mode_t使用4個字節?
- 17. DB2 sql平均行長度以字節爲單位
- 18. 爲什麼'a'是對象引用的Java字節碼前綴?
- 19. 爲什麼http.Client {}以前綴?
- 20. 爲什麼C#Convert.ToBase64String()給我88作爲一個長度,當我傳遞64個字節?
- 21. 0字符長度爲4
- 22. 爲什麼fPIC絕對需要64位而不是32位平臺?
- 23. 什麼是以字節爲單位的Lua數字類型長度?
- 24. 爲什麼以太網類型字段2字節的長度?
- 25. 爲什麼32位等於4Giga字節而不是4吉位
- 26. 爲什麼sem_t在64位linux中是32字節?
- 27. 爲什麼我無法在64位CPU上安裝64位Ubuntu?
- 28. 爲什麼節點AES128密碼的輸出長度爲32字節?
- 29. 爲什麼我的RSA 2048公鑰的長度是294字節?
- 30. 爲什麼這個代碼有3個八位字節超過4個字符?
謝謝。我沒有意識到你可以通過32位和64位進程之間的BSTR。 –
BSTR如何從32位傳遞到64位處理而不重新分配? –
@David是否重新分配,BSTR的佈局被記錄。自定義和系統提供的marshalers都依賴於這種文檔化的佈局:指向數據字符串的指針,其長度爲4字節,緊接在內存中的數據之前。考慮一個優化的編組器,用於保持共享內存狀態的對象。如果該內存映射到兩個進程中,則不能針對不同位的「BSTR」使用不同的內存佈局。 – IInspectable