C程序中的函数名是否是将函数体的起始地址保持在低级的变量?
示例:
int x = 0;这里x是内存中的和地址的标识符,函数名也是如此吗?
int sample(int x, int y) {
////code here
return 0;
}我猜:
这里的示例是内存中一个地址的and标识符,该地址保存了内存中函数的起始点。
发布于 2020-08-16 06:58:27
函数名是函数的某种句柄-它提供了一种调用函数的方式。在许多C实现中,它是函数机器码的地址(在运行程序中使用的虚拟内存中)。然而,在一些C实现中,它可能是提供有关函数的进一步信息的数据结构的地址,例如函数使用什么寄存器以及其代码在内存中的位置。
发布于 2020-08-16 11:38:55
函数名只是标识要执行的一系列语句。如果编译器知道这些语句是什么(因为函数是在名称出现的翻译单元中定义的),则编译器可以自由地将调用该函数的表达式替换为其执行将被证明与执行该函数具有相同效果的任何内容。
这种替换的一个简单例子是内联,但是编译器会根据它认为合适的方式进行分割和分割。如果调用处于尾部位置,它可以引入分支语句,而不是函数调用。它可以内联函数的一部分,留下另一部分作为一段未命名的代码,从不同的地方调用。(如果不总是需要未内联的部分,通常会这样做。)还有很多其他的可能性。从这个意义上说,函数名根本不需要标识唯一的对象。
一些函数名称被转换为函数指针,而一些函数名称具有外部链接。在这两种情况下,编译器可能不再知道函数的执行效果是什么。(在标准库函数的情况下,编译器可以知道,因此标准库函数的调用可能会被具有相同执行效果的代码替换,就像翻译单元中定义的函数一样。)
函数指针是一级对象,但它们与函数不同,尽管语法试图通过自动取消引用函数指针并在必要时自动将函数名转换为函数指针来对您隐藏这一点。一旦创建了函数指针,它必须是一个可以从中派生函数入口点的值。C和C++都保证指向同一函数的两个函数指针相等,这限制了函数指针在内部表示方式的选择。即使如此,也不能保证它包含函数实现的内存地址。例如,它可能会通过指向描述要调用的代码的结构而涉及到额外的间接性,或者它可能是某种在第一次调用函数时懒惰地解析查找函数的实现的跳板。(这些技术经常用于对具有外部链接的函数名称的外部引用。)
如果函数具有外部链接,则可以在不同的翻译单元中使用其名称作为调用该函数的一种方式。这意味着名称需要以某种方式与可以调用的代码体相对应。最终,映射必须允许计算某些机器指令的地址,这将是函数的入口点。但是这种计算不一定要在编译时完成(而且很少是这样)。即使您的代码创建了一个函数指针,该指针也完全有可能不仅仅是入口点地址。例如,它可以是跳转表中重定位条目的地址,或者可以是弹床函数的地址。
简而言之,函数名和内存中的地址之间的关系比变量名和内存中的地址之间的关系不明确得多,尽管在现实中,没有外部链接的变量,其地址永远不会被获取,也可能不对应于内存地址。(例如,该名称可能只是引用某个值的当前home,该值恰好暂时占用硬件寄存器。)
简而言之,虽然使用名称是特定内存地址的别名的计算模型很诱人,但它不是一个非常精确的模型,它可能会导致您对可执行文件的性质做出不正确的假设。
https://stackoverflow.com/questions/63431521
复制相似问题