如果我尝试分配内存:
int ramSize = magicLibrary.getRamSize();
assert(ramSize*2 <= pow(2,64-8));//Don't overflow the 64 bit limit (32 on some systems).
int * mainData new int[ramSize*2/sizeof(int)]; //2 times too big.
我会获得磁盘交换来填补空间吗?如果没有,我该如何使用swap?
答案 0 :(得分:2)
首先,new
对交换一无所知。这是操作系统的工作(至少对于通用操作系统,比如你正在使用的操作系统),它将决定何时交换以及交换什么。
话虽如此,你分配那么多内存的尝试几乎肯定会失败。即使有足够的交换内存,操作系统也会为自己保留大量虚拟地址空间,这意味着您可以分配的内容有限。例如,在32位Windows上,2GB的地址是为内核保留的,如果你尝试过,你就不会分配4GB的虚拟内存,因为没有足够的地址来代表那么多存储器中。
实际上,你在尝试做什么?
答案 1 :(得分:2)
只要RAM和Swap-space都没有完全耗尽,并且地址空间限制(即32位的2-3GB,比64位系统中的RAM更多),系统将允许您分配内存。如果RAM耗尽,系统将使用交换空间。
有时候,操作系统也会允许“过度使用”,这与航空公司“期望一些乘客不会出现”的情况基本相同,因此他们为该航班出售了一些额外的机票,并担心“全部当他们到达那一点时,座位满满的。就计算机而言,这意味着操作系统可能会允许您分配比实际可用内存更多的内存,并且“有足够的”错误稍后通过某种方式解决(通常通过释放一些内存来解决) “备用”或“杀死一些随机应用程序”)。操作系统允许这样做的原因是应用程序经常分配大量未完全使用的内存区域。填充为零的存储区也可以“合并”为“写时复制”存储器,这样如果稍后写入它,它将生成该存储器的新副本。这也可能意味着如果你分配了大量的内存,你必须实际写一些东西(除了零?)才能使它“正在使用”。同样,这反映了应用程序的典型行为“分配大量内存,将其填充为零,以后只使用其中一些” - 因此操作系统试图通过不使用大量“页面”来“节省空间”其中的零“。
请注意,内存是在RAM还是Swap是一个动态标准 - 内存一直在进行交换,程序代码和数据可以随时换出,然后在需要时将其带回。如果这是“堆”或其他一些内存并不重要,所有内存在这方面都非常相同。
目前还不完全清楚你真正希望实现的目标,但希望这至少可以解释所发生的事情。
哦,假设ramSize
是字节数,这几乎肯定是假的:
assert(ramSize*2) <= 2^(64-8)
自ramSize * 2 > 0
和(2 XOR 56) = 0
以来。
答案 2 :(得分:1)
简而言之,交换空间是硬盘上虚拟内存的一部分,在RAM已满时使用。这是操作系统的工作,而不是新操作员!
答案 3 :(得分:0)
如果使用new
,操作系统会收到内存请求。
然后它决定在哪里获得那个记忆。
与打开文件或使用cout回显相同。那些东西是建立在c ++之上的。
所以你的程序可能已经使用了swap,但是你不知道它。
如果您想了解有关此主题的更多信息,您可能需要查看unix的内部工作原理(当前使用的每个操作系统的母亲和父亲)。