【问题标题】:How much memory can we get by malloc() in x64? [closed]在 x64 中我们可以通过 malloc() 获得多少内存? [关闭]
【发布时间】:2013-06-26 04:39:25
【问题描述】:

在x64中,通过malloc()获取不到1.9G内存,而我的物理内存是8G,为什么会这样?

【问题讨论】:

  • 是32位还是64位进程?此外,物理内存!= 虚拟内存
  • 检查您的链接设置——您使用的是 64 位编译器、链接器等吗?
  • 什么操作系统?操作系统可能会施加每个进程的大小限制。要判断您是在 32 位还是 64 位模式下编译,请检查指针的大小:printf("%d\n", (int)sizeof (void*));
  • 转到此[链接][1],您会找到一些信息。 [1]:stackoverflow.com/questions/9537967/…
  • 您肯定将程序编译为 32 位进程。另外,你是把所有这些都分配在一个大块还是几个小块中?

标签: c++ c malloc


【解决方案1】:

这很可能是因为您使用的是 32 位编译器、32 位操作系统或(可能)两者兼有。

我将您的代码简化了很多,如下所示:

#include <iostream>
#include <stdlib.h>

int main() {
    void *block = malloc(1024LL * 1024LL * 1024LL * 6);
    if (block)
        std::cout << "Allocated 6 Gig block\n";
    else
        std::cout << "Unable to allocate 6 Gig block.\n";
    return 0;
}

如果我用 32 位编译器编译它,它会失败(打印出“无法分配 6 Gig 块。”如果我用 64 位编译器编译它,它会成功(打印出“分配的 6 Gig 块” ). 我没有方便的 32 位操作系统来测试它,但我有理由相信,使用 32 位操作系统,它也会失败(32 位可执行文件的行为与它在64 位操作系统,而 64 位可执行文件根本无法在 32 位操作系统上运行)。

Specs: 32-bit compilers tested: gcc 4.8.1 (MinGW), Microsoft VC++ 17.
64-bit compiler: VC++ 17.
OS: Windows 8 x64.

【讨论】:

  • (当然,编译器的位数无关紧要;这是编译器输出的位数。但是+1,因为那是迂腐...)
  • @Billy 我会说这是一个解释问题,而不是迂腐。当我阅读“32 位编译器”时,我认为是“编译 32 位代码的编译器”。根据我的经验,编译器供应商使用它的方式相同。
  • @Cody:是的……这就是我在 MSVC++ 领域的思考,它附带针对 64 位的 32 位和 64 位编译器。
  • 非常感谢,我发现我的问题是我的操作系统是 64 位的,但我认为我使用的是 32 位编译器,因为“sizeof(void*) = 4”。
  • @user 为 32 位编译的应用程序在 64 位操作系统上运行良好。这要归功于WOW64 仿真层。只有另一种方式不起作用(32 位 Windows 上的 64 位应用程序)。要将位数更改为 x64,请参阅here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多