我在结构中看到了一个union的声明,如下所示。示例代码如下。
我的问题是它是否有助于节省内存(使用联合的典型用途)?我没有看到好处。
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 :(得分:4)
这根本不是联盟的典型用法。联合是变体类型 - 您可以将许多不同类型的类型放入其中并检索它们。 只将一种类型放入联合中,除了奇怪的代码外,没有任何内容。
答案 1 :(得分:2)
嗯。好吧,上面的例子对我来说似乎有点奇怪 - 联合的通常原因是在同一个存储中有两个不同的符号路径(按字节,按字等)。但是,您给出的示例只有一个联盟成员。
我唯一能想到的是代码的编写着眼于未来的扩展--I .E。在后续版本中,工会将有其他成员。
答案 2 :(得分:2)
添加到Philippe所写的内容:Microsoft在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._12
和myMat.m[0][1]
都引用矩阵myMat
的第一行中的第二个元素。它实际上只是语法糖,因为即使最脑干的编译器也会将myMat.m[0][1]
之类的访问优化为常量偏移计算。
答案 3 :(得分:0)
在我看来,联盟实际上并没有在这里使用。我从来没有见过像这样的联盟内部的单独结构。奇怪。
答案 4 :(得分:0)
很难说变量和类型的混淆名称意味着使代码匿名,但编写它的人是否有可能错误地期望mystr结构中的字段是联合的?
答案 5 :(得分:0)
这段代码有效吗?不是因为工会只有一个领域(虽然这看起来很奇怪),但因为工会是匿名的;你如何告诉你想在内部结构mystr中解决的编译器?
structvar1 var1;
var1.mystr.ctxSC = NULL; // compile error : structvar1 has no mystr member
GCC 3.4.4将此报告为无效的ISO C.
编辑:Steve Fallows在评论中给了我答案:这是一个专有的Microsoft扩展,允许无缝结构聚合:“包含”结构的所有字段都被视为包含结构的一部分。 / p>
答案 6 :(得分:0)
不,你不能实现利益联盟应该包含一些其他成员但不仅仅是结构。它没有任何错误,但你无法获得内存优化。