在C中查找函数的大小

Vac*_*cum 6 c

我正在学习函数指针,我知道我们可以使用函数指针指向函数。然后我假设它们保留在内存中。它们保留在堆栈还是堆中?我们可以计算它们的大小吗?

Cli*_*ord 6

当您构建代码时,代码空间由链接器静态分配。在您的代码由操作系统加载的情况下,操作系统加载程序从操作系统请求该内存并将代码加载到其中。类似地,正如其名称所暗示的那样,此时分配静态数据,以及初始堆栈(尽管如果创建其他线程,可能会创建更多堆栈)。

关于确定函数的大小,链接器知道此信息,并且在大多数工具链中,链接器可以创建一个映射文件,其中包含所有静态内存对象(即那些未在运行时实例化的对象)的大小和位置。堆栈或堆上的时间)。

没有保证在运行时确定函数大小的方法(几乎没有理由这样做)但是,如果您假设链接器将源代码中相邻的函数依次定位在内存中,则以下内容可能会给出函数大小的指示:

int first_function()
{
   ...
}

void second_function( int arg )
{
    ...
}

int main( void )
{
    int first_function_length = (int)second_function - (int)first_function ;
    int second_function_length = (int)main - (int)second_function ;

}
Run Code Online (Sandbox Code Playgroud)

然而YMMV; 我在 VC++ 中尝试过这个,它只在“发布”版本中给出了有效的结果;“调试”构建的结果没有任何实际意义。我建议练习只是为了兴趣,没有实际用途。

当然,另一种观察代码大小的方法是查看调试器中代码的反汇编。