关于函数所占内存计算的问题,请帮忙~

dahua010 2008-10-13 11:08:27
以下是在xp 32位机 VC6.0得出的结果

#include <stdio.h>
int lsjfunc()
{
int a = 10;
int b = 10;
return 1;
}
int afterlsjfunc(){ return 1;}
void main()
{
int size = (int)afterlsjfunc - (int)lsjfunc; //1
printf("%d\n", (int)afterlsjfunc);//2
printf("%d\n", (int)lsjfunc);//3
printf("%d\n", size);
}


想通过这种计算来得到lsjfunc 函数所占的内存数.
但是通过代码跟踪调试,在步骤1的时候(int)afterlsjfunc 比 (int)lsjfunc大,但是计算出来的结果却是负数.

另外,在步骤2和3那里,通过int强转出来的数和原来的数也不是一样大,可能是因为位数的关系,但是因为两个地址的高位是一样的.
那么结果也不应该有太大差别啊?

请指教下,为什么会在计算大小的时候会出现负数的情况..最好能详细说明下原因.最好还能写出正确的计算方法,谢谢各位.
...全文
143 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yellowhwb 2008-10-13
  • 打赏
  • 举报
回复
int lsjfunc()
{
int a = 10;
int b = 10;
return 1;
}
int afterlsjfunc(){ return 1;}

这两个函数被编译器优化了,因为这两个函数返回值恒为1;
你改成
int lsjfunc()
{
int a = 10;
int b = 10;
return a;
}
int afterlsjfunc(){int a = 10; return a;}
用release版本试试,debug版本好像怎么改都和第一次的结果一样!
TADICAN 2008-10-13
  • 打赏
  • 举报
回复
unsined int size = (unsined int)afterlsjfunc - (unsined int)lsjfunc; //1
dahua010 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zclever 的回复:]
你这个函数是求函数所占内存的??
[/Quote]

我也不知道有什么特别好的办法,所以用第2个函数的地址减去第一个函数的地址来算大小,当然,第2个函数的return可能会使计算的结果出现问题,但是我想先计算出大小以后,在考虑怎么计算那个return.
问题是 我现在的结果向减不正确...因为如果用调试方式跟踪步骤1的话,明明是afterlsjfunc 大于 lsjfunc 的
yellowhwb 2008-10-13
  • 打赏
  • 举报
回复
这样来计算函数所占的内存空间是不行的,因为编译器会对代码进行优化。上面的代码VC6,如果编成release版的,结果是:
4198400
4198400
0
zclever 2008-10-13
  • 打赏
  • 举报
回复
你这个函数是求函数所占内存的??
zclever 2008-10-13
  • 打赏
  • 举报
回复

//VC6.0结果:
4198405
4198410
-5
Press any key to continue
dahua010 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yellowhwb 的回复:]
你再用unsigned int试试看呢!
[/Quote]

unsigned int 出来结果是一个很大的数,因为我计算出的结果是负数,通过unsigned int转换必然是个很大的结果.
不知道VC6.0为什么会出现负数的结果,我手头目前没别的编译器...郁闷啊..
想知道是为什么!!
yellowhwb 2008-10-13
  • 打赏
  • 举报
回复
你再用unsigned int试试看呢!
yellowhwb 2008-10-13
  • 打赏
  • 举报
回复
也许vc的编译器和gcc不同,经过转化了,说不定!
yellowhwb 2008-10-13
  • 打赏
  • 举报
回复
上面的代码,我在dev c++中计算出来的值不是负数啊!是正数,27

4199083
4199056
27
请按任意键继续. . .
hmsuccess 2008-10-13
  • 打赏
  • 举报
回复
ollydb 没用过,不知道好不好用
canican 2008-10-13
  • 打赏
  • 举报
回复
你编译时采用的是debug选项,这时函数名不是直接的首地址,而是一个指针指向了函数首地址
另打印变量地址可采用printf("%p",&a)形式
帅得不敢出门 2008-10-13
  • 打赏
  • 举报
回复
gcc 下面为正啊
编译器搞的鬼吧
dahua010 2008-10-13
  • 打赏
  • 举报
回复
但是ollydb 属于第3方工具~
如果我是想在代码中计算出函数所占空间大小,然后利用这个数值进行操作呢.
chlaws 2008-10-13
  • 打赏
  • 举报
回复
我认为用ollydb 比较好
dahua010 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yellowhwb 的回复:]
int lsjfunc()
{
int a = 10;
int b = 10;
return 1;
}
int afterlsjfunc(){ return 1;}

这两个函数被编译器优化了,因为这两个函数返回值恒为1;
你改成
int lsjfunc()
{
int a = 10;
int b = 10;
return a;
}
int afterlsjfunc(){int a = 10; return a;}
用release版本试试,debug版本好像怎么改都和第一次的结果一样!
[/Quote]

那请问还有别的什么好的方法来求出函数所占的空间大小么..

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧