struct内存对齐

struct MyClass
{
 int a;
 char c;
 float f;
 short s;
 double d;
} mc;

// mc最少要有19个字节

//但是!  printf("%d\n", sizeof(mc));     输出 24!

/*

结构体的内存对齐机制

1.结构体的大小,为结构成员最大基本类型的整数倍,double是8

(mc中最大基本类型是double,所以其大小应该为double的整数倍)

2.每一个结构成员后面的结构成员将存储在成员类型大小或n字节边界两者中最小的一个边界上

(挺绕口的,下面来看看怎么算)

 int a + char c + float f 这三个变量空间大于double的8字节

 故: int a 和 char c 占用8字节,其中int a占用4字节,char c占用1字节浪费3字节。

 同理 float f 和 short s占用下一个8字节,float f占用4字节,short占用2字节浪费2字节。

所以,sizeof(mc)=24 。

*/

所以建议在定义结构成员的时候,按类型从大到小的顺序定义,或者从小到大顺序定义,这样有利于内存的优化。

//关于内存对齐还可以举个栗子:比如一个windows中的文本文件,文件大小为20,162kb,占用空间可能为 20,192kb。

//结构体初始化过程中,初值表的顺序和结构成员的定义顺序要完全一致!

结构数组:一个数组,数组里面的元素是结构类型

 struct MyPoint

{

 int x;

 int y;

}

 struct MyPoint mt [10];//10个元素都是mypoint类型

 //初始化1:struct MyPoint mt1[10] = { {1,2} , {3,4} ,…… };

 //初始化2: 

for (int a = 0;a<10;a++)

{

 mt[a].x= a;

 mt[a].y= a;

}

 

结构指针:一个指针,指向一个结构

struct *pc = mt1;      //pc指向结构体变量的首地址!

 mt1.x = 20;

 pc->i = 20;

 

结构和函数的组合

1.结构变量作为函数的形参,函数的值拷贝,为了优化值拷贝过程,尽量用上指针(址传递)

 void aaa (struct MyPoint *pt , struct MyPoint*pt1)
{
      something();
}

 

2.结构变量作为函数的返回值,也要注意值拷贝

 struct MyPoint bb()
{
 struct MyPoint pt;
 return pt;  //这里只能值拷贝
}


 struct MyPoint bb( structMyPoint *pt)
{
 return pt;  //这里可以地址拷贝
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值