是任何编程语言(C++、C#、Java、C.)中声明函数的最终内存地址,无论是相对地址还是绝对地址



任何编程语言(C++、C#、Java、C…)中声明函数的最终内存地址是相对的还是绝对的?(我不是在问机器代码语言的相对或绝对寻址模式)

(我想说这是相对的,但我需要专家来评论)如果它是相对的,这意味着无论我们在哪里调用函数,函数都会被复制并放入基于程序计数器位置的堆栈中。因此,两个线程同时调用同一个函数,如果它们不共享同一个变量,它们将不会相互影响。

如果它是绝对的,这意味着两个线程调用相同的函数,它们将输入相同的地址!!(这取决于静态函数还是非静态函数)此外,每次我们创建一个类对象时,每个对象的特定大小都可能用于存储方法(函数)。然后它会使物体的大小变得非常大!

你错了。

主可执行文件中函数的虚拟内存地址是绝对的,物理内存地址甚至可以在函数运行时更改(如果操作系统交换进程)。

对于库,虚拟地址可以是绝对地址,也可以是相对地址。如果它是相对的,这被称为"位置无关代码",并且在库无法在其首选地址加载时非常有用。

代码未放置在堆栈上。本地(自动持续时间)变量通常是,这意味着并发和递归/重入调用的独立副本。由于代码是只读的,让多个线程访问同一地址是没有问题的。

在从中间语言(如Java字节码)到机器代码的转换过程中,JITted语言在运行时确定每个函数的地址。

函数也不存储在对象内部。通常,一个对象有一个指向函数指针数组的指针,以支持多态性(这称为虚拟函数)。这些函数指针是相对于对象访问的,但最终的代码地址是绝对的(同样,只有虚拟地址)。

如果函数被内联,那么它可能只作为混合到其他函数中的部分存在。

在Java编程语言的情况下,您不能在运行时修改函数的字节码(尽管您可以动态创建和加载新类)。在许多现代机器上,你不能同时执行和修改内存中的同一位置,所以这也是不可能的。即使在操作系统允许的情况下,也不会有理智的代码来做这件事

局部变量通常存储在堆栈中,而不是与函数指令一起存储。在C中的静态局部变量的情况下,这些变量将存储在全局程序文本中,同样不与函数一起存储。

最新更新