我正在使用 Microsoft Visual Studio 2008
当我创建一个指向对象的指针时,它将收到一个内存地址,在我的例子中是一个 8 位十六进制数。例如:0x02e97fc0
一台计算机可以用 8 个十六进制数字寻址 4GB 的内存。我的电脑有 8GB 内存:
这是否意味着我的 IDE 没有使用超过 4GB 的内存?
IDE 是否只能寻址我内存的前 4GB 或未使用的 8GB 内存中的任何 4GB?
问题不仅仅在于所用内存的大小。它还与所用内存的位置有关。后者在这里没有详细说明:The maximum amount of memory any single process on Windows can address
最佳答案
Where does C++ create stack and heap in memory?
嗯,C++ 并不真正处理内存,它要求操作系统这样做。当二进制对象(.exe、.dll、.so ...)加载到内存中时,这是为堆栈分配内存的操作系统。当您使用 new
动态分配内存时,您是在向操作系统请求堆中的一些空间。
1) Does that mean that my IDE is not using more than 4GBs out of my memory?
不,不是真的。事实上,像 Windows 这样的现代操作系统使用所谓的 virtual address space。 .它将明显连续的内存段(例如 0x1000
到 0xffff
)映射到一段虚拟 空间,仅供您的程序使用;您绝对不能保证对象在内存中的实际位置。当一个地址被取消引用时,操作系统会施展魔法,让您的程序访问内存中的物理地址。
拥有 32 位地址意味着您的程序的单个实例不能使用超过 4GB 的内存。同一程序的两个实例可以,因为操作系统可以在明显相同的虚拟地址段内分配两个不同的物理地址段(0x00000000
到 0xffffffff
)。 Windows 将为其自己的进程分配更多重叠的地址空间。
2) Is the IDE able to address only the first 4GB of my memory or any 4GB out of the 8GBs not used?
任何。甚至是非连续内存,甚至是磁盘内存……谁也说不准。
在有关它的评论中找到了一些微软源代码:https://msdn.microsoft.com/en-us/library/aa366778.aspx
关于c++ - C++在内存的什么地方创建栈和堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41936360/