编译后函数代码所占空间大小?

donkeydonkey 2009-03-02 09:42:13
编程实现编译后函数代码所占空间大小?
补充:求的是编译后函数代码空间,而非函数运行时候所需要的空间,也不是运行时候动态分配的空间!
谢谢高手的回答!

我见过一种方法

static DWORD WINAPI MyFunc (LPVOID pData)
{
//do something
//...
//pData输入项可以是任何类型值
//这里我们会传入一个DWORD的值做示例,并且简单返回
return *(DWORD*)pData;
}
static void AfterMyFunc (void) {
}
然后利用DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc);求取代码空间大小

两点疑问就是:
1、对于编译器都是将自己写的代码按自己编写的顺序连续存放的吗?
2、假如,对于现在的编译器是这样,那么请问这是不是标准?有没有必需要求编译器这样做?
再次感谢!

...全文
376 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nineforever 2009-03-03
  • 打赏
  • 举报
回复
汇编中类似的技巧比较常见,因为函数完全由程序员控制
而在C++中,这样的写法虽然有时候可以得到正确的结果,但是并不可靠。比如你开启了ICF优化之后,AfterMyFunc完全可能和另外一个不相关的函数共享地址
shuice 2009-03-03
  • 打赏
  • 举报
回复
虽然不一定,使用起来还是蛮不错的,好像是唯一可能计算函数长度的办法,我也这么计算的
xtting_8984313 2009-03-02
  • 打赏
  • 举报
回复
我倒是感觉这个可以通过COFF解析来解决,但是繁琐,而且一定能行,通过指针不靠谱。
叶落寒山 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 donkeydonkey 的帖子:]
两点疑问就是:
1、对于编译器都是将自己写的代码按自己编写的顺序连续存放的吗?
2、假如,对于现在的编译器是这样,那么请问这是不是标准?有没有必需要求编译器这样做?

[/Quote]

1、对于编译器都是将自己写的代码按自己编写的顺序连续存放的吗?
是的,存放于代码段。
2、假如,对于现在的编译器是这样,那么请问这是不是标准?有没有必需要求编译器这样做?
是一种标准,目前最通用的可执行文件格式PE格式。就是按这种方式来存储的。
WillyWonka 2009-03-02
  • 打赏
  • 举报
回复
这个要看编译器怎么做手脚的了,你找找汇编语言的资料看看就会明白,什么代码段之类的知识。
另外现在貌似没有什么特定的标准吧.. 不太清楚 ,UP
  • 打赏
  • 举报
回复
1.应该是不一定的。有些是动态分配的。
2.这肯定算不了标准。
xianyuxiaoqiang 2009-03-02
  • 打赏
  • 举报
回复
没听过这样的标准。比如inline函数,它可能会嵌入调用的地方,也可能和普通函数一样处理,不确定的。
  • 打赏
  • 举报
回复
1 不一定
2 肯定不是标准
dongpy 2009-03-02
  • 打赏
  • 举报
回复
1、对于编译器都是将自己写的代码按自己编写的顺序连续存放的吗?
2、假如,对于现在的编译器是这样,那么请问这是不是标准?有没有必需要求编译器这样做?
=====================================================================
1:编译器优化后是不一定的。
2:不是标准。
bfhtian 2009-03-02
  • 打赏
  • 举报
回复
帮顶
VirtualSniper 2009-03-02
  • 打赏
  • 举报
回复
学习
rgmlkthh 2009-03-02
  • 打赏
  • 举报
回复
没详细想过..
imdemon 2009-03-02
  • 打赏
  • 举报
回复
某病毒就是用的楼主那种方法。。。。。

donkeydonkey 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 huayehanshan 的回复:]
引用楼主 donkeydonkey 的帖子:
两点疑问就是:
1、对于编译器都是将自己写的代码按自己编写的顺序连续存放的吗?
2、假如,对于现在的编译器是这样,那么请问这是不是标准?有没有必需要求编译器这样做?



1、对于编译器都是将自己写的代码按自己编写的顺序连续存放的吗?
是的,存放于代码段。
2、假如,对于现在的编译器是这样,那么请问这是不是标准?有没有必需要求编译器这样做?
是一种标准,目…
[/Quote]

5楼的朋友请留步!我自己也做了个测试的程序用来计算代码所占存储空间可是第二个函数地址却在第一个前面为什么?
下面是代码

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
void fun1(int x)
{
cout<<"植入函数成功"<<x<<endl;
}
void fun2()
{
cout<<2<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{

cout<<fun1<<endl;
cout<<fun2<<endl;
cout<<(LPBYTE)fun2-(LPBYTE)fun1<<endl;
}

输出结果是-200,而且编译的结果是不定的,有时候fun1在fun2的前面?这是为什么?要是标准为什么会变?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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