Att*_*tis 1 c++ memory memory-management heap-memory stack-memory
我正在使用Microsoft Visual Studio 2008
当我创建一个指向对象的指针时,它将收到一个内存地址,在本例中为8位十六进制数。例如:0x02e97fc0
计算机使用8位十六进制数字可以寻址4GB的内存。我的计算机中有8GB的内存:
这是否意味着我的IDE占用的内存不超过4GB?
IDE是否只能处理内存的前4GB或未使用的8GB中的任何4GB?
问题不仅在于所用内存的大小。它还与所用内存的位置有关。此处没有详细介绍:Windows上任何单个进程可以处理的最大内存量
C ++在哪里在内存中创建堆栈和堆?
好吧,C ++并没有真正处理内存,而是要求操作系统来处理内存。当二进制对象(.exe,.dll,.so ...)加载到内存中时,这就是为堆栈分配内存的OS。当您使用来动态分配内存时new,您是在向操作系统请求堆中的一些空间。
1)这是否意味着我的IDE占用的内存不足4GB?
不,不是。实际上,像Windows这样的现代操作系统都使用所谓的虚拟地址空间。它映射一个明显连续的内存段(说0x1000来0xffff)到的一段虚拟的只是你的程序空间; 您绝对不能保证对象真正位于内存中的位置。取消引用地址后,操作系统会做一些魔术,让您的程序访问内存中的物理地址。
具有32位地址意味着程序的单个实例不能使用超过4GB的内存。您的程序可以有两个实例,因为OS可以在虚拟地址的显然相同的段(0x00000000to 0xffffffff)内分配物理地址的两个不同段。Windows将为其自身的进程分配更多重叠的地址空间。
2)IDE是否只能寻址我的内存的前4GB或未使用的8GB中的任何4GB?
任何。甚至不连续的内存,甚至磁盘内存……没人能告诉。
在有关它的评论中找到了一些Microsoft资料来源:https://msdn.microsoft.com/en-us/library/aa366778.aspx