如何在C++中获取函数的大小?
假设我有一个功能:
void f()
{
/*do something*/
}
Run Code Online (Sandbox Code Playgroud)
..."大小f"是指代码的大小/*do something*/,从指针指示的地址开始f.
Ste*_*sop 12
你不能.它甚至可能不是一个定义明确的概念.例如,请考虑以下代码:
int f(int a) {
return (3*a)+1;
}
int g(int a) {
return (2*a)+1;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑它发生在实践中这个特殊的例子,因为它不会是一个优化的,但是编译器被允许引进的,计算代码块a+1,然后返回,并从每个入口点的跳转到该块f和g(在每种情况下进行乘法后).那么大小是f多少?它应该包括共享块的大小吗?那么大一半?声称该函数f具有大小,在C++术语中没有意义.
而且,"指向f的指针"可能不仅仅是函数f的地址.它肯定提供了一种进入入口点的方法f,但是例如在交互模式下的ARM处理器上,指向由Thumb代码组成的函数的指针实际上是第一条指令的地址,加上1.实际上,lsb当执行跳转到函数时,指针被CPU屏蔽掉,但该位指示CPU切换到Thumb模式而不是ARM模式.所以指针的值不是函数的地址(尽管它很接近).无论如何,函数的入口点不一定是它的开头 - 如果你的编译器创建常量池或类似的,它们可以在可执行代码之前.
可能有特定于平台的方法来检查您的可执行文件(文件,或加载到内存后,或两者),并说明什么代码与C++的功能相关联.毕竟,这是调试信息的用途.但是在标准C++中没有办法做到这一点,并且标准不要求存在任何这样的机制.
好吧,从技术上讲,我不相信您可以做到,不能随便携带。
但是实际上您可能可以做到这一点:
void f() { ... }
void g() { ... }
char *fp = (char *)&f;
char *gp = (char *)&g;
int size = gp - fp;
Run Code Online (Sandbox Code Playgroud)
您有点依靠编译器在目标文件中将“ g”放在“ f”之后,并且链接程序也跟在后面,将g放在f之后。
然后,您只需减去指针即可得出差值。
可能还会涉及填充和其他可能的问题,因此它可能与功能的大小不完全相同。
| 归档时间: |
|
| 查看次数: |
6816 次 |
| 最近记录: |