结构体内存的分配,不仅数据类型相关,还和变量声明的顺序相关。
结构体中,每一个变量的占用的大小是确定的,否则是报错。
相关知识1:
cpu传输数据的方式:
cpu每次传输数据大小由它的总线条数决定,32位传输4个字节,64位传输8个字节。
这里以64位系统举例,若声明一个变量大小为8字节,起始地址位1,而cpu读取的地址为0~7,则该变量需要读取两次,显然降低了cpu的性能。
为提高cpu读取的性能,采用补齐的方法提高cpu的效率。即内存为8字节的数据,一定会被一次读取,这当然需要调整变量在内存中的起始地址,使其从0开始。
若一个变量不满足8字节,则进行补齐,保证其后一个变量的地址满足cpu读取的初始地址。
参考:https://blog.csdn.net/qq_18815817/article/details/82788394
相关知识2:
内存对齐的规则:
1.起始地址为该变量类型所占内存的整数倍,若不足则不足部分用数据填充至所占内存的整数倍。
2.该结构体所占总内存为结构体成员变量中最大数据类型的整数倍
参考:https://www.cnblogs.com/kl2blog/p/6908048.html
#include <stdio.h>
#include <string.h>
/*
结构体中占用内存的大小
*/
int main()
{
printf("hello world!\n");
struct s1
{
char a;
int b;
float c;
double d;
} str1;
struct s2
{
double a;
int b;
char c;
char m;
double d;
char e;
}str2;
struct s3
{
char a;
double d;
int b;
}str3;
struct s4
{
double d;
char a;
int b;
}str4;
printf("%d\n",sizeof(str1));
printf("%d\n",sizeof(str2));
printf("%d\n",sizeof(str3));
printf("%d\n",sizeof(str4));
return 0;
}
网友评论