Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 超过可能的虚拟地址数时会发生什么情况_C++_C - Fatal编程技术网

C++ 超过可能的虚拟地址数时会发生什么情况

C++ 超过可能的虚拟地址数时会发生什么情况,c++,c,C++,C,假设我正在为一个具有32位虚拟空间地址(4294967296个地址)的环境编写一个程序,如果创建的变量超过4294967296个,实际上超过了可能的地址数,会发生什么情况?或者一个环境中的所有程序总共使用超过4294967296个地址?这完全取决于您如何尝试这样做。它可能崩溃,可能返回错误,可能抛出异常。当达到限制时,提交内存的虚拟分配将失败。这意味着即使是标准的32位进程也可能会出现虚拟内存分配失败。 也许该链接可以帮助您: 如果创建的变量超过4294967296,会发生什么情况 我猜你很困惑

假设我正在为一个具有32位虚拟空间地址(4294967296个地址)的环境编写一个程序,如果创建的变量超过4294967296个,实际上超过了可能的地址数,会发生什么情况?或者一个环境中的所有程序总共使用超过4294967296个地址?

这完全取决于您如何尝试这样做。它可能崩溃,可能返回错误,可能抛出异常。

当达到限制时,提交内存的虚拟分配将失败。这意味着即使是标准的32位进程也可能会出现虚拟内存分配失败。 也许该链接可以帮助您:

如果创建的变量超过4294967296,会发生什么情况

我猜你很困惑。您不需要创建那么多变量。您实际上使用(使用)或C++动态内存分配(例如,上面类似::运算符new < /C>),在许多实现中使用“代码> MalOC ”。 请注意,
malloc
(在C中)和
new
(在C++中)不会创建新的变量。他们分配新的内存区域,其地址可以进入一个指针变量,如果您代码为“代码> int *PTR=Malc(100000×sieof(int);< /COD> C,或<代码> int *PTR= new int [100000 ]; C++中…< /p> A(在C或C++中)是一种源代码,它有一个名称(例如,
ptr
x000002
array
,在这里的答案)和A。在执行过程中,只有位置重要(并且变量不存在)。阅读(实际位置是什么)

因此,要有许多变量,您需要有一个巨大的源文件,例如:

int x000001;
int x000002;
<>等。你可能会(用其他程序)生成一个巨大的C或C++源文件,例如:
////etc
int x999998;
int x999999;
但是,即使你生成了40亿行的源C文件,你也没有耐心编译它。如果你这样做了,编译肯定会失败(至少在当时,我认为这是你程序整体编译的一部分)

请注意,数组声明仅定义一个变量:

/// one single variable, but a huge one
int array[4294967296];
声明一个名为
array
的变量。同样,该变量不会编译和链接(如果该变量是某个函数中的本地变量,则在运行时至少会得到一个)。典型的变量限制为一兆字节或几兆字节(这取决于操作系统和计算机)

查看wikipage中的图片并理解其含义

实际上,在32位计算机上,虚拟地址空间通常限制为给定的3GB(每个进程都运行一些,并且有自己的虚拟地址空间)。详细信息取决于操作系统。在Linux上,可以通过bash shell的
ulimit
内置来降低该限制

在Linux上,动态内存分配(
malloc
new
)主要基于修改虚拟地址空间。此类调用可能会失败(然后
malloc
将返回
NULL
而失败,
new
将引发异常),并且在32位系统上,它们将在3GB之前失败。您可能希望禁用

如果您碰巧使用Linux系统,请阅读并尝试

然后了解他们的输出。你可能也应该阅读

我建议花几天时间阅读:(可以免费下载)


(在Windows、MacOSX或Android上,
malloc
&
new
也在使用一些操作系统原语来增加虚拟地址空间。我让您来看看是哪一个)

如果在一个块中创建那么多具有静态存储持续时间的变量或自动变量,编译器或链接器可能无法创建可执行文件

如果在多个函数中创建多个自动变量并使它们同时处于活动状态,程序将因堆栈溢出而崩溃


如果您试图从动态存储中分配这么多字节,分配将失败。

如果您的特定进程试图超过进程虚拟地址空间的大小,它将只是耗尽内存。当进程耗尽内存时,将发生的正是通常发生的情况-内存分配函数将返回null poi此外,从理论上讲,在基于交换功能的虚拟内存操作系统中,耗尽地址空间是“耗尽内存”的唯一方法(现实生活比这要复杂一些,但通常是这样)


至于系统上的所有进程……你的问题被误导了。操作系统,即使是32位操作系统,也不会以任何方式限制所有进程的单个32位地址空间。对于所有实际方法和目的,操作系统可以为不同进程同时保留几乎不受限制的独立32位地址空间。

只是澄清一下,在实践中,在32位计算机上,虚拟地址空间通常限制为给定进程的3GB,这是地址空间限制(地址数),而不是一个进程可以使用的总内存限制,对吗?你的问题令人困惑。请遵循我提供的许多链接。你需要花几天或几周的时间阅读内容。我们无法在几段中回答所有这些问题。你需要读几本书。在此之前,阅读我引用的所有Wiki页面。然后花几周时间阅读rea丁书。好的,当然,我会的。我只是觉得现在我有了内存地址范围,然后我有了总的内存空间,所以举例来说,我可以有2位的内存地址空间,但100Mb的内存。我最多可以有四个指针,因为没有更多的地址,但一个指针可以引用20MB的内存(因此,内存本身并不限于2位)。也许这种理解是不正确的,它看起来不正确,你看起来很困惑。对不起,你需要花数周的时间阅读(或
cat /proc/self/maps
cat /proc/$$/maps