2008-10-30 57 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没有错,但你不能得到内存优化。