2008-10-30 87 views
0

我已經看到一些結構內部的聯合聲明如下。下面給出了示例代碼。工會聲明C代碼

我的問題是否有助於節省內存(使用聯合使用的典型用途)?我沒有看到好處。

typedef struct 
{ 
    int x1; 
    unsigned int x2; 
    ourstruct1 ov1; 
    ourstruct1 ov2; 
    union 
    { 
      struct 
      { 
       mystruct1 v1; 
       mystruct2 v2; 
       mystruct3 v3; 
       int* ctxSC; 
       mystruct4 v4; 
       Bool v5; 
       Long v6; 
       Long v7; 
       Long v8; 
       Long v9; 
      }mystr; 
    }; 
}structvar1; 

〜AD

+0

去我的問題那裏你可以看到聯盟和結構的最佳使用 http://stackoverflow.com/questions/252644/why-this-union-is-deleting-the-1st-records-in-arrays -in-the-c-code – 2008-10-31 06:04:21

回答

2

嗯。那麼,上面的例子對我來說似乎有點奇怪 - 聯合的通常原因是在同一個存儲中有兩個不同的符號路徑(按字節,單詞等)。但是,您提供的示例只有一個工會成員。

我唯一能想到的就是代碼是用來着眼未來的擴展 - I.E。該聯盟將在隨後的版本中增加成員。

4

這根本不是工會的典型用途。聯盟是變體類型 - 你可以將許多不同類型的類型放入其中並檢索它們。 只有一種類型進入工會纔會給你帶來什麼,除了怪異的代碼。

+1

當然還有美學元素。它是_is_ C,我們當然會喜歡它看起來很奇怪:) – bog 2008-10-30 05:43:59

+0

它使您可以用不同的名稱引用相同的變量。 – leod 2008-10-30 18:00:31

0

在我看來,聯盟並沒有在這裏實際使用。我從來沒有見過像這樣的聯盟中的孤立結構。奇怪。

0

很難說變量和類型的混淆名稱是爲了使代碼匿名化,但是寫這個代碼的人有可能錯誤地期望mystr結構中的字段被合併?

0

此代碼有效嗎?不是因爲工會只有一個領域(儘管這看起來很奇怪),而是因爲工會是匿名的;你如何告訴編譯器你想在內部struct mystr中尋址?

structvar1 var1; 
var1.mystr.ctxSC = NULL; // compile error : structvar1 has no mystr member 

和GCC 3.4.4本報告爲無效ISO C.

編輯:Steve Fallows給我評論了答案:這是一個專有的Microsoft擴展,允許無縫結構集合:所有領域「包含」結構被認爲是包含結構的一部分。

2

要添加到什麼Philippe寫道:微軟使用這個在DirectX來定義其D3DMATRIX(和衍生結構`D3DXMATRIX)如下:

typedef struct _D3DMATRIX { 
    union { 
     struct { 
      float  _11, _12, _13, _14; 
      float  _21, _22, _23, _24; 
      float  _31, _32, _33, _34; 
      float  _41, _42, _43, _44; 

     }; 
     float m[4][4]; 
    }; 
} D3DMATRIX;

這允許您按姓名或解決矩陣元素索引:myMat._12myMat.m[0][1]均指矩陣myMat的第一行中的第二個元素。這實際上只是語法糖,因爲即使是最聰明的編譯器也會優化訪問,例如myMat.m[0][1],以進行常量偏移計算。

0

不,你不能達到目的unif應該包含其他成員,但不僅僅是結構in.there沒有錯,但你不能得到內存優化。