gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:53 25 4
gpt4 key购买 nike

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

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

如果是absolute,就是两个线程调用同一个函数,会进入同一个地址!每个对象的可用于存储方法(函数)。那么它会使一个对象的尺寸变得非常大!

最佳答案

你错了。

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

对于图书馆来说,虚拟地址可以是绝对地址也可以是相对地址。如果是相对的,这称为“位置无关代码”,如果库无法加载到其首选地址,这将很有用。

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

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

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

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

关于c++ - 任何编程语言(C++、C#、Java、C...)中声明的函数的最终内存地址是相对的还是绝对的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com