是任何编程语言(C++、C#、Java、C.)中声明函数的最终内存地址,无论是相对地址还是绝对地址
Is the final memory address of declared functions in any programming language (C++, C#, Java, C...) relative or absolute?
任何编程语言(C++、C#、Java、C…)中声明函数的最终内存地址是相对的还是绝对的?(我不是在问机器代码语言的相对或绝对寻址模式)
(我想说这是相对的,但我需要专家来评论)如果它是相对的,这意味着无论我们在哪里调用函数,函数都会被复制并放入基于程序计数器位置的堆栈中。因此,两个线程同时调用同一个函数,如果它们不共享同一个变量,它们将不会相互影响。
如果它是绝对的,这意味着两个线程调用相同的函数,它们将输入相同的地址!!(这取决于静态函数还是非静态函数)此外,每次我们创建一个类对象时,每个对象的特定大小都可能用于存储方法(函数)。然后它会使物体的大小变得非常大!
你错了。
主可执行文件中函数的虚拟内存地址是绝对的,物理内存地址甚至可以在函数运行时更改(如果操作系统交换进程)。
对于库,虚拟地址可以是绝对地址,也可以是相对地址。如果它是相对的,这被称为"位置无关代码",并且在库无法在其首选地址加载时非常有用。
代码未放置在堆栈上。本地(自动持续时间)变量通常是,这意味着并发和递归/重入调用的独立副本。由于代码是只读的,让多个线程访问同一地址是没有问题的。
在从中间语言(如Java字节码)到机器代码的转换过程中,JITted语言在运行时确定每个函数的地址。
函数也不存储在对象内部。通常,一个对象有一个指向函数指针数组的指针,以支持多态性(这称为虚拟函数)。这些函数指针是相对于对象访问的,但最终的代码地址是绝对的(同样,只有虚拟地址)。
如果函数被内联,那么它可能只作为混合到其他函数中的部分存在。
在Java编程语言的情况下,您不能在运行时修改函数的字节码(尽管您可以动态创建和加载新类)。在许多现代机器上,你不能同时执行和修改内存中的同一位置,所以这也是不可能的。即使在操作系统允许的情况下,也不会有理智的代码来做这件事
局部变量通常存储在堆栈中,而不是与函数指令一起存储。在C中的静态局部变量的情况下,这些变量将存储在全局程序文本中,同样不与函数一起存储。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- 无法将内存地址转换为值
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取 R 数据帧的内存地址
- c++ 编译器是否保护常量内存地址免受任何更改?
- 如何防止矢量的内存地址更改
- cout 打印内存地址而不是值
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- C++在变量的内存地址上做什么来"deallocate"它?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?