亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么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 關注
  • 1108 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號