猿问

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

Linux环境下,使用g++编译,发现C++局部数组变量地址间隔是16字节的倍数,为什么呢?有什么办法可以控制间隔的大小。

char str1[] = "abcd";
char str2[2];
printf("address_str1= %p\n",str1);
printf("address_str2= %p\n",str2);

结果是:
address_str1= 0x7ffff0554e20
address_str2= 0x7ffff0554e10

白板的微信
浏览 1051回答 2
2回答

蝴蝶不菲

应该有以下几个目的一个是防止偶然性的数组越界造成的损害,因为大部分的数组越界发生在数组之后1、2个下标的地方。将将好分配内存,会导致出错概率增大很多。一个是提高性能,提高性能有两个,一个是字节对齐,可以提高内存访问的效率。对于双通道内存来说,它一次性可以访问128b/256b的内存,也就是16/32字节,那么如果数据不对齐,就需要额外的时钟周期访问,就很低效。还有就是减少重新分配内存导致的内存碎片。

繁星点点滴滴

这个在计算机组成原理里面叫地址对齐,地址是16字节的,那么16字节的倍数的对齐就方便了计算机去寻址。而且你不能固话的理解他是16字节的倍数,地址的分配是编译器行为。address_str1= 0x7ffcdede0a2baddress_str2= 0x7ffcdede0a29实际上指针代表的是寻地址,指针长度实际上和最大的寻址长度是有关系的,32位机的最大寻址长度为4Byte,所以实际上sizeof(p)就是指针p的地址,那肯定是4呀!但是8位单片机,16位单片机和64位单片机就不一样了,如果8位的单片机用8位的编译器编译,sizeof(p)必是1。我们有时候发现为啥我们用64位的电脑编译,发现sizeof(p)=4呢,因为我们用的编译器是32位的。
随时随地看视频慕课网APP
我要回答