【问题标题】:Adresses in virtual memory for Windows 32 bit mfc application.Windows 32 位 mfc 应用程序的虚拟内存中的地址。
【发布时间】:2017-02-07 15:34:10
【问题描述】:

我有相当大的 Windows MFC 应用程序,我使用 Visual Studio 作为 32 位生产发布版本构建。

我的应用程序中有一些特殊的类具有 int 索引成员。该索引始终等于该对象在内存中的地址。一切正常。

但是现在我需要确定我的应用程序的虚拟内存中肯定不包含该类的对象的一些空间。 当我在调试器中看到它们时,间隔值通常不是非常低或非常高,但它们在某个值附近。我可以安全地假设地址 0-10k (0x0000-0x2710) 将不包含该特定类的那些对象吗?如果没有,还有其他一些“安全”的地址空间吗?

或者如果没有这样的事情,也许我可以自己分配一些内存来拥有虚拟“池”,我可以确定不会创建其他对象?

【问题讨论】:

  • 创建单独的堆,为这个类覆盖operator new并从这个堆中分配这个对象
  • 您可以使用VirtualAlloc(MEM_RESERVE) 分配一些地址空间。除非您将其放在那里,否则该地址空间中没有任何内容。备选方案:Windows 不会将任何对象放入内存的底部 64KB(0x0000 到 0xFFFF)。在 Windows 8 之前,应用程序可以使用技巧来手动将对象放置在那里,但从 Windows 8 开始,这也是不允许的。
  • 您正在询问您提出的解决方案。但你真正想解决什么问题?

标签: c++ windows mfc 32-bit virtual-memory


【解决方案1】:

这都是可怕的系统特定的,但前提是你可以忍受这个限制......

    如果您只需要一个项目,
  • 0 将起作用。
  • Windows 保证不在前 64K 内存中放置任何对象,因此任何小于 65536 的值都是好的。 (由 Raymond Chen 评论后添加)。
  • 如果您的代码没有使用“大地址空间感知”编译,您可以使用 0x80000000 之后的任何地址。 (不幸的是,如果它,虽然在 32 位平台上保留了 1G,但在 64 位平台上你的程序没有保留地址空间。)
  • 如果您的数据有对齐要求(并且如果它包含 32 位索引,那么几乎可以肯定它至少对齐了 4 个字节),那么任何未对齐的值都可以使用。特别是,任何奇数值都会起作用。 (同样,在 Raymond Chen 发表评论后添加)。

【讨论】:

  • 另一种选择:如果对象有对齐要求,则选择任何未对齐的值。
猜你喜欢
  • 2014-03-12
  • 2018-07-09
  • 2011-03-19
  • 2011-06-01
  • 2012-01-30
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多