c++ - C++在内存的什么地方创建栈和堆?

标签 c++ memory memory-management heap-memory stack-memory

我正在使用 Microsoft Visual Studio 2008

当我创建一个指向对象的指针时,它将收到一个内存地址,在我的例子中是一个 8 位十六进制数。例如:0x02e97fc0

一台计算机可以用 8 个十六进制数字寻址 4GB 的内存。我的电脑有 8GB 内存:

  1. 这是否意味着我的 IDE 没有使用超过 4GB 的内存?

  2. 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。 .它将明显连续的内存段(例如 0x10000xffff)映射到一段虚拟 空间,仅供您的程序使用;您绝对不能保证对象在内存中的实际位置。当一个地址被取消引用时,操作系统会施展魔法,让您的程序访问内存中的物理地址。

Diagram of relationship between the virtual and physical address spaces.

拥有 32 位地址意味着您的程序的单个实例不能使用超过 4GB 的内存。同一程序的两个实例可以,因为操作系统可以在明显相同的虚拟地址段内分配两个不同的物理地址段(0x000000000xffffffff)。 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/

相关文章:

c++ - 如何在 C++ 中使用 GetProcessMemoryInfo?

c++ - Lambda 到 std::function 的转换性能

c++ - 我可以制作 C++ 对象的按位拷贝吗?

c++ - 如何检查std::unique_ptr是否为空(如果它位于std::vector中)?

c - gcc 编译器没有连续分配内存

ios - 用于转发到 Objective-C 中复制的属性的正确属性语义

c++ - 声明一个模板函数,它接收两个通用迭代器作为参数

c++ - 为什么这个程序输出8589934593而不是4294967298?

asp.net - ASP.NET 是否限制单个对象的内存使用? 256MB 字节数组抛出 OutOfMemoryException

c - 这个自定义的malloc可以吗?