4 回答

TA貢獻1828條經驗 獲得超3個贊
#include <iostream> int main() { short i, j; std::cout << &i - &j << std::endl; system ( "pause" ); } |
在Visual Studio界面上,把下圖的Debug改成Release(鼠標點一下Debug,然后選擇Release)!
改完之后再按Ctrl + F5,看看運行結果!
Visual C++編譯器在調試模式下會啟用堆棧檢查功能,該功能會修改堆棧的內存布局(分配額外的存儲),用于檢測潛在的越界和堆棧破壞。代碼中兩個相鄰的局部變量分配的內存空間不是挨著一起就是因為這個。
除此之外,C++標準沒有規定相鄰局部變量的內存必須相鄰,所以內存位置還是由實現決定的。
如果代碼中沒有對局部變量區地址(&),編譯器可以將該變量存儲在寄存器中已優化其存儲速度(64位CPU包含更多的通用寄存器)。這種優化,代碼中兩個相鄰的局部變量存儲位置就不能說“差幾個字節了”。

TA貢獻1744條經驗 獲得超4個贊
首先:你好好學學編程語言
你所定義不是數組誰說他倆的地址就一定是相隔的然后差兩個字節的距離
只有數組在物理地址上才是連續的。
編譯器,在進行數據處理的時候最小單位是幾個字節,
你的操作系統是多少位的32位,64位,你內存的物理地址是多少位的這都有關系啊。當然你的是32位的,4個字節,定義一個數組然后看看其相隔的距離是不是兩個字節。當然肯定是。

TA貢獻1789條經驗 獲得超10個贊
現在的CPU大多是32位的,也就是一次能處理32個二進制位,正好4個字節
程序使用的是虛擬內存,每一個頁表項的大小為4字節,
4字節對齊可以使CPU讀取內存效率最高。
假如不對齊,在取一個整型數時可能要讀兩次內存再合到一起。
- 4 回答
- 0 關注
- 156 瀏覽
添加回答
舉報