簡體   English   中英

聯合與比特屏蔽和比特移位

[英]union vs bit masking and bit shifting

在存儲一些信息(如一系列字節)並能夠一次或逐個訪問它們時使用unions有什么缺點。

示例:顏色可以用RGBA表示。 所以顏色類型可以定義為,

typedef unsigned int RGBAColor;

然后我們可以使用位的“移位和屏蔽”來“檢索或設置”RGBAColor對象的紅色,綠色,藍色,alpha值(就像在具有諸如D3DCOLOR_ARGB()類的宏函數的Direct3D函數中完成一樣)。

但是,如果我使用了一個聯盟,

union RGBAColor
{
unsigned int Color;
struct RGBAColorComponents
{
    unsigned char Red;
    unsigned char Green;
    unsigned char Blue;
    unsigned char Alpha;
} Component;
};

然后我不需要總是進行移位( << )或屏蔽( & )來讀取或寫入顏色分量。 但這有問題嗎? (我懷疑這有一些問題,因為我沒有看到有人使用這種方法。)

Can Endianness可以成為一個問題嗎? 如果我們總是使用Component來訪問顏色組件並使用Color來訪問整個事物(用於復制,分配等等),那么字節順序應該不是問題,對吧?

- 編輯 - 我發現一個舊帖子也是同樣的問題。 所以我想這個問題有點重新發布:P對不起。 這里是鏈接: 在C ++中使用聯合是一個好習慣嗎?

根據答案,似乎在C ++中使用給定示例的聯合是可以的。 因為那里沒有數據類型的變化,它只有兩種方式來訪問相同的數據。 如果我錯了,請糾正我。 謝謝。 :)

在C ++中,這種聯合使用是非法的,其中聯合包含重疊但互斥的對象。 你不能寫一個工會的一個成員,然后讀出另一個成員。

它在C中是合法的,這是推薦的打字方式。

這涉及(嚴格)別名的問題,這是編譯器在嘗試確定具有不同類型的兩個對象是否不同時所面臨的困難。 語言標准不一致,因為專家們仍在確定可以安全地提供哪些保證而不犧牲性能。 就個人而言,我避免所有這一切。 int實際上會用於什么? 翻譯的安全方法是復制字節,如memcpy

還有endianness問題,但這是否重要取決於你想用int做什么。

我相信使用union 可以解決與endianness相關的任何問題,因為很可能RGBA順序是按網絡順序定義的。 此外,每個組件都是uint8_t或類似的事實,可以幫助一些編譯器使用符號/零擴展加載,將低8位直接存儲到非符號字節指針,甚至能夠並行化一些字節操作(例如,arm有一些打包4x8位指令)。

暫無
暫無

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

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