C ++程序计算出我的计算机有多少内存?

时间:2014-02-03 06:31:13

标签: c++

以下工作会怎样?

将指针(对任何类型的对象)初始化为0.

int* thisPtr = 0;

通过递增指针直到它到达最后一个存储位置来执行指针运算。我们知道它是最后一个内存位置,因为向指针添加1将不会执行任何操作。跟踪我们访问过的内存位置。

int count = 1;
 while (thisPtr + 1 > thisPtr) { 
    ++thisPtr;
    ++count;
}

现在count等于我们能够访问的内存位置数。将它乘以指针中的字节数。

int bytesInMemory = count * sizeof(int*);

这有用吗?如果不是,为什么,以及正确的方法是什么?

5 个答案:

答案 0 :(得分:2)

不,不。

从理论上讲,它所做的是未定义的。在实践中,对于32位程序,它总是返回4GB,并且对于64位程序,需要花费大量时间(如:比宇宙的年龄更长)。

指针只是数字。如果您将int* thisPtr替换为unsigned int thisPtr,请将thisPtr++替换为thisPtr += 4并将thisPtr + 1替换为thisPtr + 4,您将获得一个等效的程序(32比特系统)。它只是找到一个整数的最大可能值。

C ++没有办法找出你的系统有多少内存。操作系统将有办法实现,但没有适用于任何操作系统的标准C ++方式。

答案 1 :(得分:1)

在现代计算机上,内存已成为一个复杂的主题,但大多数情况下你并不需要了解太多。

要获得已安装物理RAM的大小,请在Windows上执行以下操作:

    uint64_t nBytes=0;
    bool bOK = GetPhysicallyInstalledSystemMemory(nBytes);

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/cc300158.aspx

在Linux上,您可以尝试:

    uint64_t nBytes = sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);

请参阅http://linux.die.net/man/3/sysconf

更感兴趣的是可配置的虚拟内存(或交换空间)的数量,直到硬盘上的备用空间。

同样有趣的是工作集大小。这是程序当前使用的RAM(不交换)量。当操作系统交换页面时,它会不断变化。

要问的问题是“你为什么想知道?”。你想要实现什么目标?

答案 2 :(得分:0)

这不起作用,因为您可能会将指针增加到系统内存之外。对此没有固有的限制。此外,当您考虑分页等因素时,内存模型比仅仅可访问地址的长块更复杂。

没有一种方法可以获得系统内存的大小。

答案 3 :(得分:0)

所以首先0并不意味着,内存位置在0位置(基本上它意味着空),并且逻辑和物理地址之间存在差异。我们无法在用户空间程序中访问这种方式,但内核可能会这样做那个。所以在用户程序中我们无法访问任何内存位置,这会导致陷阱。 由操作系统维护的页表映射逻辑和物理地址。因此,访问外部范围的地址会导致中断生成。

答案 4 :(得分:0)

我不知道你在谈论什么记忆。
但是有一种简单的方法可以找出硬盘内存大小。
如果在Windows操作系统上进行开发,请使用WMI,它特别适合以良好的建模方式获取系统数据。