为了账号安全,请及时绑定邮箱和手机立即绑定

为什么C++局部数组变量地址间隔是16字节的倍数?

为什么C++局部数组变量地址间隔是16字节的倍数?

C++
白板的微信 2018-07-25 10:14:12
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字节,那么如果数据不对齐,就需要额外的时钟周期访问,就很低效。
还有就是减少重新分配内存导致的内存碎片。

查看完整回答
反对 回复 2018-07-27
?
繁星点点滴滴

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位的。


查看完整回答
反对 回复 2018-07-27
  • 2 回答
  • 0 关注
  • 1057 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信