剖析结构体和大小端

结构体

1.概念

1.结构体:描述一个事物,问题的一系列数据的集合.
例:

struct person
{
char name[20];
int year;
int class;
int phone;
char addr;
};


2.作用

1.内置类型无法描述需要表述的事物,问题时就会定义结构体
2.返回的参数不只是一个而是一个集合时就会采用结构体

3.内存对齐问题


(以下问题都是在32位平台讨论)
  • 产生内存对齐的问题的原因
    1.不是所有的硬件平台都只支持访问任意地址上的任意数据
    2.内存对齐可以提高工作效率,对于没有对齐的数据,内存访问的时候可能会处理两次而对齐的数据可以只访问一次
    内存对齐就是典型的以空间换时间的做法
  • 内存对齐规则
    1.第一个成员与结构体变量的偏移量为0的地址处
    2.剩余的变量要对齐到某个(对齐数)的整数倍的位置上
    对齐数为编译器默认的一个对齐数与该成员大小的较小值。
    VS中默认的值为8
    linux中默认的值为4

3.结构体总大小为最大对齐数(第一个成员变量没有对齐数)的整数倍
4.如果结构体中有成员变量的类型是结构体被,镶嵌的结构体对齐到自己的最大对齐数的整数倍处,结构体总大小为最大对齐数的整数倍(遵循第3条原则:这里的最大对齐数包括被嵌套结构体的对齐数)

例:
struct student
{
char a;
double c;
int b;
}
剖析结构体和大小端_第1张图片
struct person
{
char p;
student s;
int q;
}
剖析结构体和大小端_第2张图片

大小端

1.背景

在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,1byte=8bit;从语言中处理有1byte的char类型还有2byte的short,4byte的int等等
,char本身就只占1字节当然没有问题,但是int是4字节,这时就会产生4字节在寄存器中存放的位置的问题.

定义

大端:把数据的高位字节放在内存的低位地址处,把数据的低位字节放在内存的高位地址处
小端:把数据的低位字节放在低位地址处

判断大小端的方法

方法一:

void main()
{
int num=0x12345678;
char* p=(char*)& num;
//通过将int(4字节)强转换成char单字节p指向num的起始字节(低字节)
if(*p==0x78)
{
//低字节存放在低位置处
printf(“小端\n”);
}
else
{
printf(“大端\n”);
}
}
方法二
void main()
{
//原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成
//员共享存储空间
union A
{
int num;
char ch;
}
union A p;
p.num=0x12345678;
if(p.ch==0x78)
{
//低字节存放在低位置处
printf(“小端\n”);
}
else
{
printf(“大端\n”);
}
}

你可能感兴趣的:(c++)