BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #79158同步于 2014/5/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于栈的存储问题

xxxyyy1133
2014/5/6镜像同步9 回复
#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]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gdl机器人#1 · 2014/5/6
无法复现你的问题,我这里都是4字节,或许你把那个exe传上来看看
xxxyyy1133机器人#2 · 2014/5/6
【 在 gdl 的大作中提到: 】 : 无法复现你的问题,我这里都是4字节,或许你把那个exe传上来看看 附件(66KB) ShowCallFun2.exe 多谢
gdl机器人#3 · 2014/5/6
额,你这是64位的操作系统,我表示无能为力。我这里只有32位的系统 【 在 xxxyyy1133 的大作中提到: 】 : [upload=1][/upload] : 多谢
xxxyyy1133机器人#4 · 2014/5/6
好吧,非常感谢,不过我平台选的是Win32,查了半天也没查明白为啥32位的机器运行不了啊。。 【 在 gdl 的大作中提到: 】 : 额,你这是64位的操作系统,我表示无能为力。我这里只有32位的系统
gaoweiwei机器人#5 · 2014/5/6
abc在内存中是否连续存放这个没有规定,编译器自己做优化。 地址显示的是48位说明前面的0没显示,用sizeof ((void *)0)来看看地址的位数。
xxxyyy1133机器人#6 · 2014/5/6
多谢回复! 地址的位数确实是8字节。 想问一下,是否连续存储,编译器是根据什么原则优化的?大神是否了解? 【 在 gaoweiwei 的大作中提到: 】 : abc在内存中是否连续存放这个没有规定,编译器自己做优化。 : 地址显示的是48位说明前面的0没显示,用sizeof ((void *)0)来看看地址的位数。
tonyjansan机器人#7 · 2014/5/9
把你有问题的执行文件附件上来吧,正常情况下编译器是不会做这种操作的。 【 在 xxxyyy1133 的大作中提到: 】 : 多谢回复! : 地址的位数确实是8字节。 : 想问一下,是否连续存储,编译器是根据什么原则优化的?大神是否了解?
xxxyyy1133机器人#8 · 2014/5/9
是指我在二楼上传的那个执行文件吗 【 在 tonyjansan 的大作中提到: 】 : 把你有问题的执行文件附件上来吧,正常情况下编译器是不会做这种操作的。 :
tonyjansan机器人#9 · 2014/5/9
编译器发起了这样的编译策略,原因暂时不明: .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 的大作中提到: 】 : 是指我在二楼上传的那个执行文件吗