簡體   English   中英

typedef一個數組與在C ++中使用結構

[英]typedef'ing an array vs. using a struct in C++

找到了一個有趣的使用typedef,我真的沒有看到它的需要。

typedef int Color[3];

那么使用將是:

Color pants;
pants[0] = 0;
etc.

通過ptrs使用typedef創建了一些看起來很奇怪的代碼。

為什么不使用結構?

struct Color {
int r;
int g;
int b;
};

Color pants;
pants.r = 0;
etc.

您可以使用聯合將變量表示為數組或單獨表示,這是不可思議的,但仍然清楚它比單個值更復雜。

有人可以提供有關使用typedef'd數組與結構的優點的見解嗎?

可能是結構沒有按原編碼器想要的方式對齊。 也許它被填充到16或32位。 創建數組可確保不會發生結構填充。 這是傳遞給驅動程序還是某些硬件設備?

由於幾個原因,使用普通數組是一個壞主意。

  • 當在參數列表中使用時, int[]類型衰減為int *
  • 您不能使用operator=來分配數組。

structboost::array可以更好地滿足目的。

結構形式的另一個優點:如果您需要將Color傳遞給函數然后獲取其大小:

void foo (Color c)
{
    size_t s = sizeof(c);
}

如果使用數組形式,則c將被解釋為Color * (數組通過指向其第一個元素的指針傳遞), sizeof(c)將等於sizeof(int*) 去過那里,做到了,被咬了。

編輯:結構形式將表現為(天真)預期。

您希望數組表達式能夠循環。

因此,如果您必須擁有[rgb]表單,則使用union,但這樣可以進行更多輸入。

::嘆::

使用結構數組時,可能的填充可能會成為一個問題,因為您可能會遇到問題,並希望在緊密壓縮的RGB之間進行轉換。 在這種情況下,請確保填充正是您所期望的,例如使用pragma pack()

至於.x或[]是否更好,您可以為結構重載operator[] (在這種情況下使用開關)。 任何體面的編譯器都會將其優化為等於static_cast<int*>(this)[index] ,因此不存在性能損失。 你當然可以選擇工會,但這並沒有多大幫助。 另一種可能性是在[]方面實現.x()等。

無論如何,我建議使用結構,因為你沒有松散任何東西(你仍然可以將Color數組轉換為int* ,但是你可以在獲取結構時比使用int*時更容易編寫算法 - 例如,如果你想要亮度,IMAO更容易有一個好的成員/自由函數采用Color而不是int *,因為使用int,你無法確定它是RGB,RGBA,YoCoCg而使用Color,你可以強制執行那。

最后但並非最不重要的是,如果需要,結構使您可以將所有成員初始化為有效/合理/調試值。

我猜這個數組被用作元組,所以boost :: tuple可以被認為是更好地顯示意圖的替代方案。

暫無
暫無

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

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