Top.Mail.Ru
Ответы

Вопрос про Struct и Union в языке Си

Здравствуйте, я создал объединение и структуру, их члены одинаковые, но занимают они разное место (это понятно почему), но мне лично не понятно, почему структура занимает в памяти 48 байт, когда, если сложить "вес" её членов, то получится 44 байта, а не 48. Откуда эти 48 байт?
На картинке все понятно

1234567891011121314151617181920212223242526272829
 #include <stdio.h> 
 
union union1 
{ 
	int a; 
	double b; 
	char c[32]; 
}; 
 
struct struct1 
{ 
	int a = 0; 
	double b = 0; 
	char c[32] = "Alex"; 
}; 
 
union union1 test1; 
struct struct1 test2; 
 
 
int main(void) 
{ 
	printf("sizeof union1: %zu\n", sizeof union1); 
	printf("sizeof struct1: %zu\n", sizeof struct1); 
	printf("sizeof test1.a: %zu\n", sizeof test1.a); 
	printf("sizeof test1.b: %zu\n", sizeof test1.b); 
	printf("sizeof test1.c: %zu\n", sizeof test1.c); 
	printf("\n4 + 8 + 32 = %d\n", 4 + 8 + 32); 
} 
По дате
По Рейтингу
Аватар пользователя
Новичок

Архитектура так устроена, что для быстрого доступа к элементу в памяти он должен быть расположен в не в произвольном месте, а в кратном собственному размеру.
если взять массив из структур double + char то вы думаете что будет:
[ddddddddcddddddddcddddddddc...]
при таком расположении видно что только первый дабл расоложен по кратному 8 адресу (0000). следущий дабл будет находится по адресу (0009) тоесть кратность нарушена. Поэтому такая структура будет расположена в памяти иначе:
[ddddddddc-------ddddddddc-------ddddddddc-------...] где "-" это незадействованные байты для выравнивания. Как видим один элемент такого массива занимает уже 16 байт а не 9. И все даблы сидят по адресам 0000, 0016, 0032... тоесть кратны 8.
Так как структура по сути является массивом длинной в 1 элемент, то к ней тоже применяется выравниваение.

Кстати из за этого порядок данных в структуре тоже имеет значение.
double char double char - занимает 32 байта
double double char char - занимает 24 байта
это следует учитывать.

Аватар пользователя
Высший разум

Выравнивание по 6*8=48 по 8 байт наверное. Почитай где-то, я сейчас не помню и искать нет охоты

Аватар пользователя
Оракул
Аватар пользователя
Мыслитель

у тебя еще есть строка "Alex", которая занимает 4 байта,
ей же тоже нужно где-то место выделить для хранения,
а описана она как раз в структуре как константная строка