如何获得以字节为单位的函数的长度?

我想在运行时知道C函数的长度(由我写的)。 任何方法来得到它? 看来sizeof在这里不起作用。

标准C没有办法获得一个函数占用的内存量。

有一种方法可以确定函数的大小。 该命令是:

nm -S <object_file_name> 

这将返回目标文件中每个函数的大小。 请参阅GNU手册页面,使用man nm来收集更多信息。

如果您使用自定义链接器脚本,则可以从链接器获取此信息。 为给定的函数添加一个链接器部分,在两边都有链接器符号:

 mysec_start = .; *(.mysection) mysec_end = .; 

然后,您可以专门将该function分配给该部分。 符号之间的区别是函数的长度:

 #include <stdio.h> int i; __attribute__((noinline, section(".mysection"))) void test_func (void) { i++; } int main (void) { extern unsigned char mysec_start[]; extern unsigned char mysec_end[]; printf ("Func len: %lu\n", mysec_end - mysec_start); test_func (); return 0; } 

这个例子是为GCC,但任何C工具链应该有一个方法来指定哪一个部分分配一个function。 我会根据汇编列表检查结果,以validation它是否按照您希望的方式工作。

可执行文件(至less有一些被删除的debugging信息)不以任何方式存储函数长度。 所以没有可能在运行时自行parsing这个信息。 如果必须使用函数进行操作,则应该在链接阶段对对象执行某些操作,或者将其作为可执行文件的文件进行访问。 例如,你可以告诉链接器将符号表作为普通数据段链接到可执行文件中,为它们分配一些名称,并在程序运行时parsing。 但请记住,这将是特定于您的链接器和对象格式。

另请注意,函数布局也是平台特定的,并且有些术语使得术语“函数长度”不清楚:

  1. 函数可以在函数代码之后直接在代码段中存储常量,并使用PC相对寻址(ARM编译器执行此操作)访问它们。
  2. function可能具有“序言”和“结语”,这些function可能是几个function共有的,因而在主体之外。
  3. function代码可以内联其他function代码

他们都可以计数或不计算function长度。

另外函数可能会被编译器完全内联,所以它松开了它的主体。

在例如Codewarrior中,你可以在一个函数周围放置标签,例如

 label1: void someFunc() { /* code goes here. */ } label2: 

然后像(int)(label2-label1)那样计算大小,但是这显然是非常依赖于编译器的。 根据你的系统和编译器,你可能需要破解链接器脚本等。

函数的开始是函数指针,你已经知道了。

问题是要find结果,但是可以这样做:

 #include <time.h> int foo(void) { int i = 0; ++i + time(0); // time(0) is to prevent optimizer from just doing: return 1; return i; } int main(int argc, char *argv[]) { return (int)((long)main - (long)foo); } 

它在这里工作,因为程序只有两个函数,所以如果代码被重新sorting(主要在foo之前执行),那么你将得到一个不相关的(负)计算,让你知道它不是这样工作,但它会工作如果将foo()代码移动到main()中 – 只需减去初始否定答复的main()大小即可。

如果结果是肯定的,那么它将是正确的 – 如果没有填充(是的,一些编译器愉快地夸大代码,无论是为了alignment或其他,不太明显的原因)。

结尾(int)(long)强制转换用于32位和64位代码之间的可移植性(在64位平台上,函数指针将更长)。

这是非常便携的,应该工作得很好。

在C或C ++中没有标准的方法。 有可能自然存在doiung它的实现/平台特定的方式,但我不知道任何

在C语言本身没有定义任何工具来返回一个函数的长度; 涉及的variables太多(编译器,目标指令集,目标文件/可执行文件格式,优化设置,debugging设置等)。 完全相同的源代码可能导致不同系统的不同大小的function。

C并没有提供任何支持这种信息的reflection能力(尽pipe单个编译器可以提供扩展,例如sskuce引用的Codewarrior示例)。 如果您需要知道您的函数在内存中占用了多less字节,那么您将不得不直接检查生成的对象或可执行文件。

sizeof func将不起作用,因为expression式func被当作​​指向函数的指针,所以你得到的是一个指针值的大小,而不是函数本身。

只需从下一个函数的地址中减去函数的地址即可。 但请注意,它可能无法在您的系统上工作,所以只有在您100%确定的情况下才能使用它:

 #include <stdint.h> int function() { return 0; } int function_end() { return 0; } int main(void) { intptr_t size = (intptr_t) function_end - (intptr_t) function; } 

你可以通过减去函数的地址findC函数的长度。 让我给你提供一个例子

 int function1() { } int function2() { int a,b; //just defining some variable for increasing the memory size printf("This function would take more memory than earlier function ie function01 "); } int main() { printf("Printing the address of function01 %p\n",function01); printf("Printing the address of function02 %p\n",function02); printf("Printing the address of main %p\n",main); return 0; } 

希望你编译后得到你的答案。 编译完成后,你可以看到function01和function2的大小不同。

注意:通常在一个函数和其他函数之间有16个字节的差异。