Вопрос о союзах и памяти Mgmt - PullRequest
       16

Вопрос о союзах и памяти Mgmt

0 голосов
/ 22 сентября 2011

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

union Values
{
    int ivalue;
    double dvalue;
};

Values v;

Итак, я знаю, что int использует 4 байта, а double использует 8 байтов, так что всего выделено 8 байтов (я думаю), с учетом того, сколько памяти будет v использовать?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Вы в значительной степени ответили на свой вопрос: при наличии четырехбайтового int и 8-байтового double, v будет использоваться 8 байт памяти.

Если вы не уверены, выможет скомпилировать и запустить простую программу, которая распечатает sizeof(v).

0 голосов
/ 22 сентября 2011

Учитывая, что int - это 4 байта, а double - это 8 байтов (что не гарантировано языком), sizeof (Values) - это как минимум 8 байтов.

Чаще всего это будет ровно 8 байтов (в общем случае, sizeof (int) или sizeof (double), в зависимости от того, что больше), но компиляторам разрешается добавлять безымянные отступы в структуры и объединения. Для структур, любое такое дополнение может быть между любыми двумя членами или после последнего; для союзов это может быть только в конце.

Цель такого заполнения - обеспечить лучшее выравнивание. Например, учитывая:

union u {
    char c[5];
    int i;
};

, если int равен 4 байта и требует выравнивания 4 байтов, компилятор должен будет добавить заполнение, чтобы sizeof (union u) по крайней мере 8 байтов.

В вашем конкретном случае, вероятно, нет причин добавлять какие-либо отступы, но вы не должны предполагать, что их нет. Если вам нужно узнать размер объединения, просто используйте sizeof.

...