返回信息流#include <iostream>
using namespace std;
void main()
{
int a = 1;
int b = 1;
int c = 1;
cout << &a << endl << &b << endl << &c << endl;
cout << sizeof(a) << endl;
}
输出为:
1、整型数在此机器上占4个字节
2、栈的存储应该是连续的
问题:为啥三个数的地址差了12个字节?(编译环境是vs2013)
同样的代码在linux上用g++编译得到的结果如下:
三个数的地址确实相差4个字节,问题是地址为啥是48位?(操作系统是64位的)
感谢大神的解答!![ema11]
这是一条镜像帖。来源:北邮人论坛 / cpp / #79158同步于 2014/5/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于栈的存储问题
xxxyyy1133
2014/5/6镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 gdl 的大作中提到: 】
: 无法复现你的问题,我这里都是4字节,或许你把那个exe传上来看看
附件(66KB) ShowCallFun2.exe
多谢
额,你这是64位的操作系统,我表示无能为力。我这里只有32位的系统
【 在 xxxyyy1133 的大作中提到: 】
: [upload=1][/upload]
: 多谢
好吧,非常感谢,不过我平台选的是Win32,查了半天也没查明白为啥32位的机器运行不了啊。。
【 在 gdl 的大作中提到: 】
: 额,你这是64位的操作系统,我表示无能为力。我这里只有32位的系统
abc在内存中是否连续存放这个没有规定,编译器自己做优化。
地址显示的是48位说明前面的0没显示,用sizeof ((void *)0)来看看地址的位数。
多谢回复!
地址的位数确实是8字节。
想问一下,是否连续存储,编译器是根据什么原则优化的?大神是否了解?
【 在 gaoweiwei 的大作中提到: 】
: abc在内存中是否连续存放这个没有规定,编译器自己做优化。
: 地址显示的是48位说明前面的0没显示,用sizeof ((void *)0)来看看地址的位数。
把你有问题的执行文件附件上来吧,正常情况下编译器是不会做这种操作的。
【 在 xxxyyy1133 的大作中提到: 】
: 多谢回复!
: 地址的位数确实是8字节。
: 想问一下,是否连续存储,编译器是根据什么原则优化的?大神是否了解?
是指我在二楼上传的那个执行文件吗
【 在 tonyjansan 的大作中提到: 】
: 把你有问题的执行文件附件上来吧,正常情况下编译器是不会做这种操作的。
:
编译器发起了这样的编译策略,原因暂时不明:
.text:00418E00 var_20 = dword ptr -20h
.text:00418E00 var_14 = dword ptr -14h
.text:00418E00 var_8 = dword ptr -8
.text:00418E1E C7 45 F8 01 00 00 00 mov [ebp+var_8], 1 ; a
.text:00418E25 C7 45 EC 01 00 00 00 mov [ebp+var_14], 1 ; b
.text:00418E2C C7 45 E0 01 00 00 00 mov [ebp+var_20], 1 ; c
.text:00418E33 8B F4 mov esi, esp
.text:00418E35 68 E3 13 41 00 push offset sub_4113E3
.text:00418E3A 8B FC mov edi, esp
.text:00418E3C 8D 45 E0 lea eax, [ebp+var_20] ; &c
.text:00418E3F 50 push eax ; &c入栈
.text:00418E40 8B DC mov ebx, esp
.text:00418E42 68 E3 13 41 00 push offset sub_4113E3
.text:00418E47 8B C4 mov eax, esp
.text:00418E49 8D 4D EC lea ecx, [ebp+var_14] ; &b
.text:00418E4C 51 push ecx ; &b入栈
.text:00418E4D 8B CC mov ecx, esp
.text:00418E4F 68 E3 13 41 00 push offset sub_4113E3
.text:00418E54 8B D4 mov edx, esp
.text:00418E56 89 B5 18 FF FF FF mov [ebp+var_E8], esi
.text:00418E5C 8D 75 F8 lea esi, [ebp+var_8] ; &a
.text:00418E5F 56 push esi ; &a入栈
上编译器版本和编译附加参数看看能不能复现吧~可以肯定的是:楼主得到结果是编译器主动发起的编译策略。
另外2013这main入口点保护也太扯了吧- -跳了半天才进正文...
【 在 xxxyyy1133 的大作中提到: 】
: 是指我在二楼上传的那个执行文件吗