最近在看鸡啄米关于c++的教程,偶然发现了结构体中两个好玩的东西。
首先是结构体成员如果是字符数组,该怎么赋值?
以一个结构体为例:
struct si{
char x[5];
char y;
float z;
double m;
}su;
我用的su.x="abcd"和直接在定义是初始化,均报错。后来经过搜索发现有三种方法:
第一种是用for循环一个一个元素的赋值;
第二种是用strcpy(su.x,"abcd")赋值;
第三章是用memcpy(su.x,"abcd",4)赋值。
然后就是激动人心的结构体在内存中的存储方式了。
C语言中结构体的存储方式是采用对齐的方式,目的是提高访问内存的效率。但是,结构体是怎样对齐的呢?
就是变量的存放地址应该能够整除变量的字节数。4字节的变量应该存放在可以被4整除的地址上,8字节同理。
在上述例子中,x存放在0~4上;y存放在5上;z为floa型变量,大小为4字节,所以应该对齐存放在能够被4整除的地址上,为8~11;同理,m为double型变量,大小为8字节,所以应该对齐存放在能够被8整除的地址上,为16~23。综合上面的,该结构体的大小应该为24。
所以,想必大家也就看出来了,struct结构体的存储顺序是会影响存储空间的使用率的。虽然最近经常听到的说法是现在的存储越来越低廉,因此在编码的时候可以不那么在意存储空间的使用率,把更多的精力放在提高程序的运行时间。但是真的是这样吗?我觉得现在随便一个啥数据量都那么大,节约存储空间还是必不可少的。所以在以后定义结构体时,要尽量把相同数据类型的变量连续写才比较好~