为了账号安全,请及时绑定邮箱和手机立即绑定

在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 关注
  • 180 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号