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

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

在visual c++里定義一個短整型的i和j的變量,為什么間隔是4個字節而不是兩個字節?

在visual c++里定義一個短整型的i和j的變量,為什么間隔是4個字節而不是兩個字節?

C++ C
神不在的星期二 2022-05-12 19:06:55
但是看到物理地址&i和&j分別是0x0019ff34和0x0019ff30,我想問下為啥間隔是4個字節而不是兩個字節,short類型的存儲空間不是兩個字節嗎?
查看完整描述

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包含更多的通用寄存器)。這種優化,代碼中兩個相鄰的局部變量存儲位置就不能說“差幾個字節了”。


查看完整回答
反對 回復 2022-05-15
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

首先:你好好學學編程語言

  1. 你所定義不是數組誰說他倆的地址就一定是相隔的然后差兩個字節的距離

    只有數組在物理地址上才是連續的。

  2. 編譯器,在進行數據處理的時候最小單位是幾個字節,

  3. 你的操作系統是多少位的32位,64位,你內存的物理地址是多少位的這都有關系啊。當然你的是32位的,4個字節,定義一個數組然后看看其相隔的距離是不是兩個字節。當然肯定是。


查看完整回答
反對 回復 2022-05-15
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

現在的CPU大多是32位的,也就是一次能處理32個二進制位,正好4個字節
程序使用的是虛擬內存,每一個頁表項的大小為4字節,
4字節對齊可以使CPU讀取內存效率最高。
假如不對齊,在取一個整型數時可能要讀兩次內存再合到一起。

查看完整回答
反對 回復 2022-05-15
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

因為兩個變量的地址可能不是連續分配的
你如果用數組或者結構體的話,就能看出地址間隔是2了

查看完整回答
反對 回復 2022-05-15
  • 4 回答
  • 0 關注
  • 156 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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