код декларации профсоюзов - PullRequest
0 голосов
/ 30 октября 2008

Я видел некоторое объявление объединения внутри структуры следующим образом. Пример кода приведен ниже.

Мои вопросы, это помогает в любой экономии памяти (типичное использование, для которого используется объединение)? Я не вижу выгоды.

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

Ответы [ 7 ]

4 голосов
/ 30 октября 2008

Это не типичное использование для союза вообще. Объединения являются вариантами типов - вы можете помещать в них много разных типов и извлекать их. Помещение в объединение только одного типа ничего не дает , кроме странно выглядящего кода.

2 голосов
/ 30 октября 2008

Чтобы добавить к тому, что Филипп пишет: 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. Это на самом деле просто синтаксический сахар, так как даже самый компилятор braindead оптимизирует доступ, такой как myMat.m[0][1], в расчете с постоянным смещением.

2 голосов
/ 30 октября 2008

Хм. Что ж, приведенный выше пример мне кажется немного странным - обычная причина объединения состоит в том, чтобы иметь два разных символических пути в одном хранилище (байтами, словами и т. Д.). Однако в приведенном вами примере есть только один член объединения.

Единственное, о чем я могу думать, это то, что код написан с расчетом на будущее расширение - I.E. что в последующих версиях профсоюза будут иметься дополнительные члены.

0 голосов
/ 31 октября 2008

нет, вы не можете получить пользу, потому что unoin должен содержать несколько других членов, а не только структуру in. В этом нет ничего плохого, но вы не можете добиться оптимизации памяти.

0 голосов
/ 30 октября 2008

Этот код действителен? Не потому, что объединение имеет только одно поле (хотя это кажется странным), а потому, что объединение является анонимным; как сказать компилятору, что вы хотите использовать во внутренней структуре mystr?

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

И GCC 3.4.4 сообщает об этом как о недействительном ISO C.

РЕДАКТИРОВАТЬ: Стив Фолловс дал мне ответ в комментарии: это проприетарное расширение Microsoft, которое позволяет бесшовную агрегацию структуры: все поля «включенной» структуры рассматриваются как часть содержащей структура.

0 голосов
/ 30 октября 2008

Трудно сказать с запутанными именами переменных и типов, предназначенными для того, чтобы сделать код анонимным, но возможно ли, что человек, который написал его, ошибочно ожидал, что поля внутри структуры mystr будут объединены?

0 голосов
/ 30 октября 2008

Мне кажется, что союз на самом деле здесь не используется. Я никогда не видел одинокую структуру внутри подобного союза. Странно.

...