C++;在内部声明变量时是否生成随机地址?为什么’;它不是线性存储吗? 我很想知道C++或任何编程语言如何决定使用它的变量和指令的内存地址。这些十六进制值是完全随机的还是经过计算的?我确实知道指令是连续存储在内存中的,并且有一个程序计数器在其上递增以提供指令的地址。但是为什么变量是随机存储的,为什么不直接线性存储呢?

C++;在内部声明变量时是否生成随机地址?为什么’;它不是线性存储吗? 我很想知道C++或任何编程语言如何决定使用它的变量和指令的内存地址。这些十六进制值是完全随机的还是经过计算的?我确实知道指令是连续存储在内存中的,并且有一个程序计数器在其上递增以提供指令的地址。但是为什么变量是随机存储的,为什么不直接线性存储呢?,c++,pointers,memory-address,C++,Pointers,Memory Address,当您调用new或malloc时,它使用系统相关函数返回映射内存页(AFAIK通常为4K大小)。系统负责映射内存页和内存管理“算法”(如new或malloc)确保正确分配地址。当您使用整个页面时,它会向操作系统请求另一个页面,等等 好的,OS函数是:在Windows和unix系统上。相对于您的程序,变量的位置由编译器决定 编译器不需要为变量分配内存。变量可以放在寄存器中 如果编译器使用堆栈,操作系统可能会将指向堆栈内存的指针传递给可执行文件。尽管编译器可能会对变量的位置进行排序,但如果存在变量,它

当您调用
new
malloc
时,它使用系统相关函数返回映射内存页(AFAIK通常为4K大小)。系统负责映射内存页和内存管理“算法”(如
new
malloc
)确保正确分配地址。当您使用整个页面时,它会向操作系统请求另一个页面,等等


好的,OS函数是:在Windows和unix系统上。

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

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

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

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

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


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

它们不是随机存储的,尽管具体细节是编译器和平台之间不同的实现细节。FWIW,操作系统会随机化进程内存:堆栈变量和堆变量地址也可能会出现很大的不同。同样,这取决于平台/编译器实现堆栈与堆的方式。请显示您的程序及其输出,并询问有关该特定输出的特定问题。某些操作系统上可能存在地址空间布局随机化的重复,它明确地将某些地址随机化,以帮助恶意客户端更难利用漏洞。在最近的Unix上,它主要是
mmap
sbrk
几乎已经过时(当然可以避免:可以使用
mmap
和不使用
sbrk
来实现
malloc