c++ - C++在内部声明变量时如何生成随机地址?为什么它不线性存储它们?

标签 c++ pointers memory-address

我非常渴望了解 C++ 或任何编程语言如何确定用于其变量和指令的内存地址。这些十六进制值是完全随机的还是计算出来的?我知道指令是连续存储在内存中的,并且有一个程序计数器在它上面递增以提供指令的地址。但是为什么变量是随机存储的,为什么不直接线性存储呢?

最佳答案

变量的位置由编译器相对于您的程序自行决定。

编译器不需要为变量分配内存。变量可以放在寄存器中。

如果编译器使用堆栈,操作系统可能会将指向堆栈内存的指针传递给可执行文件。尽管编译器可能会对变量的位置进行排序,但如果存在的话,它们的确切地址将由操作系统确定。在许多嵌入式系统中,变量可以放在段中,而段则由编译器放置在固定位置。

对于动态内存,大多数实现调用操作系统函数来分配内存。嵌入式系统可能不同,动态内存有固定的位置。

有许多属性会影响变量的位置:任务放置、内存可用性和虚拟内存,仅举几例。许多操作系统会分配内存给任务使用,所有变量和代码都驻留在这个区域。某些操作系统可能会将内存换出到另一个设备,例如硬盘驱动器(也称为分页或虚拟内存)。

操作系统通常会确定程序变量(和内存空间)的起始位置。实际位置有很多决定因素,例如正在运行的其他任务(使用内存)、系统内存容量、虚拟内存和可执行代码大小。编译器可能会在程序的内存区域内对变量进行排序。

关于c++ - C++在内部声明变量时如何生成随机地址?为什么它不线性存储它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014506/

相关文章:

c - 为什么变量的地址在运行之间不断变化?

assembly - 使用 gdb 的堆栈地址

c++ - 如何使用boost检查文件是否已经打开

c++ - 我可以通过这种方式为链接列表实现push_back方法吗?

c++ - 编译器如何评估 `typeid` 运算符?

c - 将数据写入 C 中另一个程序的指针?

c - 在c中用指针和char结构

python - 为什么Python中的id函数对不同的整型对象返回相同的值?

c++ - qt图表等轴(轴应该形成正方形而不是矩形)

c++ - 使用基类指针删除派生类时内存泄漏