【发布时间】:2021-08-10 15:15:23
【问题描述】:
我有一个关于内存分配的问题,尤其是在使用 MSVC2019 时。
我有一个编译为 x64 的 C++ 程序。 通过调试我看到,分配变量会产生非常高的指针地址,指向前 4GB 地址空间(32 位)上的位置。如果我在任务管理器中检查程序,我发现它只使用了大约 30-50MB 的内存。
实际上4GB以下的整个地址空间都没有使用时,变量没有分配到虚拟内存空间的下部是什么原因?
我希望分配从低地址开始,直到使用的第一个 4GB 空间,不需要分配空间。
为什么这对我来说很有趣: 我有一个包含超过 15 年历史的 C++ 代码的大型 SW,它并非到处都准备好成为 64 位,在许多地方它将指针转换为 32 位类型,因此指针被损坏。最初的作者很可能假设指针是 32 位的。当编译为 64 位时,实际上应该也是如此,因此程序没有使用太多内存,内存使用量不会增长超过 4GB。而且似乎使用 2010 年的编译器编译时,不会出现这个问题,可能是那个时候内存分配导致地址在第一个 4GB 块中,即使是为 x64 编译的。
我的问题是: 这种分配策略会以某种方式影响 MSVC++ 2019 吗?例如。指示他的编译器/链接器/内存管理器优先分配前 32 位空间,直到不再需要?或者,为内存管理器提供的虚拟地址空间设置大小限制,例如。通过设置为 2GB,我可以实现永远不会有任何指针指向超过 4GB 的已分配块。这样,假设指针为 32 位,旧代码将在强制转换操作中继续存在。
我已经尝试在链接器选项中将高内存感知设置为 NO,并检查了堆参数,但它们都没有帮助。
谢谢!
【问题讨论】:
-
请花一些时间刷新the help pages,尤其是名为"What topics can I ask about here?" 和"What types of questions should I avoid asking?" 的部分。也请使用tour 并阅读How to Ask 的好问题。最后请阅读this question checklist。
-
您不会通过确保您的程序使用可以用 32 位枚举的内存来解决问题。实际上,使用 32 位的演员阵容不正确的可能性很高
-
内存地址是虚拟的,它们不直接映射到物理地址。这就是虚拟内存的工作原理。
-
还阅读有关“地址空间布局随机化”的概念,以进一步了解为什么程序最终从所有可用地址空间中分配内存是一件好事。
-
问题不是为什么它是一件好事,而是如何禁用这个好事并回到旧的方式。并非所有好的新事物在每种情况下都对每个人都有好处,我正在寻找是否有办法选择退出,并在 MSVC++2019 上获得与在 MSVC++2010 上相同的行为。如果没有,那么我们唯一的办法就是修复代码,或者切换到 32 位。
标签: c++ pointers memory-management visual-c++-2019