2015-01-21 3 views
2

я следующее объединениеСколько памяти союз нужно

typedef union rem{ 
    int addr; 
    char addrbuf[32]; 
} foo; 

SizeOf на объединении дает следующий вывод

foo addr; 
printf("size is: %d\n",sizeof addr); 

размер составляет: 32

Означает ли это, что союз выделяет или нуждается в памяти, равной наибольшему элементу в объединении при определении?

+1

Да. Зависит от члена максимального размера. –

+0

Да, до выравнивания. –

+0

Действительно ли вы определяете экземпляр объединения или сопоставляете указатель на структуру, содержащую этот союз, где первый член структуры (m_eAddrType) сообщает вам, как интерпретировать следующий член структуры, который является этим объединением (т.е. посмотрите. addr vs. глядя на .addrBuff? Я реализовал эту структуру данных «вариант записи», используя структуру, содержащую объединение. – franji1

ответ

7

Означает ли это, что союз выделяет или нуждается в памяти, равной наибольшему элементу в объединении при определении?

Да. Выделяется память для самого большого члена. Вот почему члены union хранятся в одном месте.

Предполагая int требуется 4 байта, для объединения

union{ 
    char c; 
    int i; 
} U; 

память будет выделена как:

enter image description here

Обратите внимание, что, как c и i перекрытия. Фактически c - это первый байт i.

+4

Также может быть выделено пространство для заполнения. –

1

Память, занятая объединением в отличие от структуры, будет памятью для наибольшего члена союза. Но в зависимости от реализации в конце может быть дополнительная прокладка, поэтому нет гарантии, что size of a union = size of the largest member. Таким образом, вы можете сказать, что размер союза будет по крайней мере размером с наибольшим членом союза.

Боковое примечание. Поскольку память распределяется между всеми членами объединения, за один раз активен только один член.

Смежные вопросы