0

我在结构中看到了一些联合声明,如下所示。下面给出的示例代码。

我的问题是它是否有助于节省内存(联合用于的典型用途)?我没有看到好处。

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;

-广告

4

7 回答 7

4

这根本不是联合的典型用途。联合是变体类型 - 您可以将许多不同类型的类型放入其中并检索它们。仅将一种类型放入联合中不会给您带来任何好处,除了看起来很奇怪的代码。

于 2008-10-30T05:33:49.837 回答
2

To add to what Philippe wrote: Microsoft uses this in DirectX to define its D3DMATRIX (and the derived structure `D3DXMATRIX) as follows:

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;

This allows you to address the matrix elements either by name or by index: both myMat._12 and myMat.m[0][1] refer to the second element in the first row of the matrix myMat. It's really just syntactic sugar, since even the most braindead compiler will optimize accesses such as myMat.m[0][1] into a constant offset calculation.

于 2008-10-30T18:01:54.400 回答
2

唔。好吧,上面的例子对我来说似乎有点奇怪——联合的通常原因是有两个不同的符号路径进入同一个存储(按字节、按字等)。但是,您给出的示例只有一个工会成员。

我唯一能想到的是代码是着眼于未来的扩展——即联盟将在后续版本中拥有更多成员。

于 2008-10-30T05:32:48.560 回答
0

不,你不能获得好处 unoin 应该包含一些其他成员,但不仅仅是结构。它没有任何问题,但你无法获得内存优化。

于 2008-10-31T05:10:22.350 回答
0

在我看来,工会实际上并没有在这里使用。我也从未见过这样的联合内部有一个单独的结构。奇怪的。

于 2008-10-30T05:35:40.893 回答
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 扩展,允许无缝结构聚合:“包含”结构的所有字段都被视为包含结构的一部分。

于 2008-10-30T14:56:30.200 回答
0

很难说用于使代码匿名的变量和类型的混淆名称,但是编写它的人是否可能错误地期望 mystr 结构内的字段是联合的?

于 2008-10-30T06:06:52.843 回答