[转载] 数据结构在内存里的大小与对齐(C语言)

this is a test file, Sharing and the structure of the memory allocation.
//Print the data type of the memory size allocated.
//32-bit processors running in the results and comments should be equal.
//In the running linux system, the result is different.

#include <stdio.h>

//test 1
union data_1
{
double d;    // 8 byte
int   i;    // 4 byte
char c1;   // 1 byte
char c2[9];//9 byte ;由于最大的数据类型是8,共用9字节但要以8字节对齐,整个共用体应该分配16字节内存;
};

//test 2
struct data_2
{
double d;    // 8 byte
int   i;    // 4 byte
char c1;   // 1 byte
char c2[9];//9 byte ,实际上c2=9与i=4、c1=1以8对齐是16;所以整个结构体分配的内存大小为8+16=24;
};

//test 3
union data_3
{
int   i;    // 4
char c1;   // 1
char c2[9];//1*9 = 9,但要以int 4 对齐,实际分配了12字节;整个共用体应该分配12字节内存
};

//test 4
struct data_4
{
int   i;    // 4
char c1;   // 1
char c2[9];//1*9 = 9, c2=9与i=4、c1=1: 4+1+9=14以4对齐为16
};

//test 5
union data_5
{
char c1;   // 1
char c2[3];// 1*3=3; 共用体共用最大的类型所分配的内存3,以1对齐后还是3;
};

//test 6
struct data_6
{
char c1;   // 1
char c2[2];//1*2=2;结构体实际分配的内存是所有数据类型分配的内存的总和1+2=3,以1对齐为3;
};

//test 7
struct data_7
{
char c1;// 1 实际以8对齐c1分配了8字节的内存
double d; // 8 最大数据类型8
char c2;//1 和c1一样,也分配了8字节的内存;所以结构体分配的总内存为:8+8+8=24
};

//test 8
struct data_8
{
char c1; // 1
char c2; // 1 实际上和c1以8对齐后c2和c1以8对齐后,共分配了8字节内存
double d; // 8 所以结构体总分配的内存为8+8=16;
};

//test 9
struct inner_9
{
char c1; // 1
double d; // 8
char c2; // 1 结构体共分配24字节内存,同data_7
};
union data_9
{
struct inner_9 t1; // 24
int i;         // 4
char c;         // 1 共用24字节内存,以8对齐仍为24字节
};

//test 10
struct inner_10
{
char c1;
double d;
char c2; //同data_7,分配了24字节
};
struct data_10
{
struct inner_10 t1; //24
int i;          //4
char c;          //1 ,c和i:4+1=5要以inner_10里面的d=8对齐,总分配8字节内存;所以整个结构体分配的内存为24+8=32;
};

//test 11
struct data_11
{
int     a; // 4
long    b; // 4
double c; // 8
float   d; // 4
char    e; // 1
short   f; // 2 f和e、d:4+1+2=7,以8对齐,共分配了8字节内存以8对齐;所以整个结构体分配的内存为:4+4+8+8=24
};

//test 12
struct data_12
{
int     a; //4
long    b; //4
double c; //8
float   d; //4
char    e[3];//3 e和d:4+3=7,以8对齐,共分配了8字节的内存
short   f; //2   以8对齐还得分配8字节内存;整个结构体共分配了32字节内存
};

//test 13
typedef union
{
long i; // 4
int k[6]; //4*6=24
char c; //1 ;共用体分配24字节内存,以4对齐后还是24字节
}DATA_13;
struct data_13
{
int cat;     //4 ;4要以8对齐,分配8字节
double dog; //8
DATA_13 cow; //24 ;结构体以最大基本数据类型8对齐,共分配8+8+24=40
};
DATA_13 max;

int main()
{
printf("compare size practice(before ?=) and forecast(back of ?=)\n\n");
printf("test 1 sizeof(union data_1) = %d ?= 16\n",
sizeof(union data_1));
printf("test 2 sizeof(struct data_2) = %d ?= 24\n",
sizeof(struct data_2));
printf("test 3 sizeof(union data_3) = %d ?= 12\n",
sizeof(union data_3));
printf("test 4 sizeof(struct data_4) = %d ?= 16\n",
sizeof(struct data_4));
printf("test 5 sizeof(union data_5) = %d ?= 3\n",
sizeof(union data_5));
printf("test 6 sizeof(struct data_6) = %d ?= 3\n",
sizeof(struct data_6));
printf("test 7 sizeof(struct data_7) = %d ?= 24\n",
sizeof(struct data_7));
printf("test 8 sizeof(struct data_8) = %d ?= 16\n",
sizeof(struct data_8));
printf("test 9 sizeof(union data_9) = %d ?= 24\n",
sizeof(union data_9));
printf("test 10 sizeof(struct data_10) = %d ?= 32\n",
sizeof(struct data_10));
printf("test 11 sizeof(struct data_11) = %d ?= 24\n",
sizeof(struct data_11));
printf("test 12 sizeof(struct data_12) = %d ?= 32\n",
sizeof(struct data_12));
printf("test 13 sizeof(union data_13)%d+sizeof(struct max)%d = %d ?= 64\n",
sizeof(struct data_13), sizeof(max), sizeof(struct data_13)+sizeof(max));

return 0;
}

做个快乐的自己。
原文地址:https://www.cnblogs.com/Jessy/p/1869238.html