以下工作会怎样?
将指针(对任何类型的对象)初始化为0.
int* thisPtr = 0;
通过递增指针直到它到达最后一个存储位置来执行指针运算。我们知道它是最后一个内存位置,因为向指针添加1将不会执行任何操作。跟踪我们访问过的内存位置。
int count = 1;
while (thisPtr + 1 > thisPtr) {
++thisPtr;
++count;
}
现在count
等于我们能够访问的内存位置数。将它乘以指针中的字节数。
int bytesInMemory = count * sizeof(int*);
这有用吗?如果不是,为什么,以及正确的方法是什么?
答案 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,它特别适合以良好的建模方式获取系统数据。