簡體   English   中英

C++ UE4 - bool vs. uint8: 1 vs. uint32: 1 - 各自的優缺點?

[英]C++ UE4 - bool vs. uint8 : 1 vs. uint32 : 1 - pros and cons of each?

So, I'm familiar with the concept of packing a bunch of Boolean values using a single bit inside of an integer (bit masking I think its called), and thus you conserve memory because a Boolean is a byte and you fit more than one Boolean 字節長 integer。 因此,如果你有足夠多的布爾值,將它們打包在一起會產生很大的不同,我們看到在原生虛幻源代碼中,這種特殊的優化被大量使用。 但是,我不清楚的是,這有什么缺點? 有些地方使用了許多常規布爾值。 另外,為什么在某些地方使用 uint32 而在某些地方使用 unint8? 我讀過可能有一些讀寫相關的低效率或什么? 基本上,我有點理解,但不完全。 所以請 ELI5 - 如果可以的話,請給我一個更復雜的解釋。 提前致謝。 我是一個相當不錯的程序員,但我在某些領域缺乏教育,就像我的經驗一樣。 我已經自學了很多,但我的知識仍然存在一些差距。 我很感激你們在這里幫助教人,長期潛伏者。 第一次海報。

最大的問題是沒有指向“packed bool”的指針——就像你有一個包含 32 個布爾值的 int32 一樣,你不能制作bool*bool&以正確的方式引用它們中的任何一個。 這是因為字節是最小的 memory 單元。

在 STL 中,他們制作了std::vector<bool>以節省空間並且在語義上與其他向量具有相同的接口。 為此,他們必須制作從operator []返回的特殊代理 class ,因此需要執行boolVec[5] = true類的操作。 不幸的是,這種過度復雜化導致了std::vector<bool>的性能和使用方面的許多問題。

即使是壓縮布爾值的簡單指令也往往是復合的,因此比通過bool表示並占用整個字節的布爾值更重。 此外,修改打包 boolean 的值可能會導致多線程環境中的數據競爭。

基本上,硬件根本不能很好地支持布爾值。

接下來,操作系統設計器的圖像 POV 和您創建共享庫(又名 dll)的通用接口。 現在如何處理布爾值? 字節是最小的 memory 單元,因此要傳遞單個 boolean 仍然需要使用至少一個字節。 那么為什么不簡單地忘記 bool 的存在並簡單地通過單個字節傳遞它呢? 所以我們甚至不需要實現這種不必要的 bool 類型,它將為所有語言的所有編譯器編寫者節省大量時間。

uint8uint32 另外,請注意 Windows 的 COM(組件 object model - 不是串行端口)對 Z84E2C6905AB5F2DA27ZEA5 使用int16 一般來說,它本質上並不重要,因為當將值傳遞給共享庫的 function 時,復雜的東西不會對性能產生任何明顯的影響,因為您已經調用了更重的 function。 還是為什么會這樣? 我想他們很久以前設計它時有一些原因,每個人都已經忘記了原因,他們只是保持不變,因為改變它會導致向后兼容性方面的徹底災難。

在 C99 中,為布爾值引入了_Bool ,但它只是 unsigned int 的不同名稱。 我從這個起源的uint32用於布爾值的用法中想象。 一般來說,就性能而言, int應該是最有效的 integer 類型(這就是為什么它的大小沒有嚴格定義的原因) - 所以 C 委員會選擇了據說最有效的類型來表示布爾值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM