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

#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 байта,
ей же тоже нужно где-то место выделить для хранения,
а описана она как раз в структуре как константная строка