Linux环境下,使用g++编译,发现C++局部数组变量地址间隔是16字节的倍数,为什么呢?有什么办法可以控制间隔的大小。char str1[] = "abcd";
char str2[2];
printf("address_str1= %p\n",str1);
printf("address_str2= %p\n",str2);结果是:address_str1= 0x7ffff0554e20address_str2= 0x7ffff0554e10
2 回答
蝴蝶不菲
TA贡献1810条经验 获得超4个赞
应该有以下几个目的
一个是防止偶然性的数组越界造成的损害,因为大部分的数组越界发生在数组之后1、2个下标的地方。将将好分配内存,会导致出错概率增大很多。
一个是提高性能,提高性能有两个,一个是字节对齐,可以提高内存访问的效率。对于双通道内存来说,它一次性可以访问128b/256b的内存,也就是16/32字节,那么如果数据不对齐,就需要额外的时钟周期访问,就很低效。
还有就是减少重新分配内存导致的内存碎片。
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
这个在计算机组成原理里面叫地址对齐,地址是16字节的,那么16字节的倍数的对齐就方便了计算机去寻址。
而且你不能固话的理解他是16字节的倍数,地址的分配是编译器行为。
address_str1= 0x7ffcdede0a2b
address_str2= 0x7ffcdede0a29
实际上指针代表的是寻地址,指针长度实际上和最大的寻址长度是有关系的,32位机的最大寻址长度为4Byte,所以实际上sizeof(p)就是指针p的地址,那肯定是4呀!但是8位单片机,16位单片机和64位单片机就不一样了,如果8位的单片机用8位的编译器编译,sizeof(p)必是1。我们有时候发现为啥我们用64位的电脑编译,发现sizeof(p)=4呢,因为我们用的编译器是32位的。
- 2 回答
- 0 关注
- 1050 浏览
添加回答
举报
0/150
提交
取消