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 關注
- 1108 瀏覽
添加回答
舉報
0/150
提交
取消