Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 任何编程语言(C+;+;,C#,Java,C…)中声明函数的最终内存地址是相对的还是绝对的?_C++_Multithreading_Function_Callstack - Fatal编程技术网

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

C++ 任何编程语言(C+;+;,C#,Java,C…)中声明函数的最终内存地址是相对的还是绝对的?,c++,multithreading,function,callstack,C++,Multithreading,Function,Callstack,任何编程语言(C++,C#,Java,C…)中声明函数的最终内存地址是相对的还是绝对的?(我不是问机器代码语言的相对或绝对寻址模式) (我会说这是相对的,但我需要专家来评论) 如果它是相对的,这意味着无论我们在哪里调用函数,函数都将被复制并根据程序计数器的位置放入堆栈中。因此,两个线程同时调用同一个函数,如果它们不共享同一个变量,则不会相互影响 如果是绝对值,这意味着两个线程调用相同的函数,它们将输入相同的地址!!(是否取决于静态或非静态函数)此外,每次我们创建一个类对象时,每个对象的一定大小可

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

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

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

你错了

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

对于库,虚拟地址可以是绝对地址,也可以是相对地址。如果是相对的,则称为“位置独立代码”,如果库无法在其首选地址加载,则此代码非常有用

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

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

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

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

你错了

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

对于库,虚拟地址可以是绝对地址,也可以是相对地址。如果是相对的,则称为“位置独立代码”,如果库无法在其首选地址加载,则此代码非常有用

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

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

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


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

对于Java编程语言,您不能在运行时修改函数的字节码(尽管您可以动态创建和加载新类)。在许多现代机器上,您无法同时执行和修改内存中的同一位置,因此这也是不可能的。即使是在操作系统允许的情况下,也没有健全的代码能够做到这一点


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

对于Java编程语言,您不能在运行时修改函数的字节码(尽管您可以动态创建和加载新类)。在许多现代机器上,您无法同时执行和修改内存中的同一位置,因此这也是不可能的。即使是在操作系统允许的情况下,也没有健全的代码能够做到这一点


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

我可以说代码只是告诉处理器下一步要做什么的指令吗。如果两个线程调用同一个函数并传递具有相同地址的变量,那么它可能变得不安全。我说的对吗?我错了。只有参数和局部变量将被放入堆栈中。我说的对吗?@WooD:使用同一地址的两个线程是否不安全取决于它们是向该地址写入还是仅仅从该地址读取。并发读取是完全安全的,根本不需要任何同步。你剩下的评论是正确的。我可以说代码只是告诉处理器下一步该做什么的指令。如果两个线程调用同一个函数并传递具有相同地址的变量,那么它可能变得不安全。我说的对吗?我错了。只有参数和局部变量将被放入堆栈中。我说的对吗?@WooD:使用同一地址的两个线程是否不安全取决于它们是向该地址写入还是仅仅从该地址读取。并发读取是完全安全的,根本不需要任何同步。您的其余评论是正确的。是否可以执行和修改内存区域取决于虚拟内存映射表中的权限。Wheth