加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 超过可能的虚拟地址数时会发生什么

发布时间:2020-12-16 10:37:20 所属栏目:百科 来源:网络整理
导读:假设我正在为一个具有32位虚拟空间地址(4294967296地址)的环境编写程序,如果创建超过4294967296个变量会发生什么,实际上超过了可能的地址数?或者环境中的所有程序共同使用超过4294967296个地址? 解决方法 what happens if create more than 4294967296 var
假设我正在为一个具有32位虚拟空间地址(4294967296地址)的环境编写程序,如果创建超过4294967296个变量会发生什么,实际上超过了可能的地址数?或者环境中的所有程序共同使用超过4294967296个地址?

解决方法

what happens if create more than 4294967296 variables

我猜你很困惑.你不会创造那么多变量.实际上你使用C dynamic memory allocation(使用malloc & free and friends)或C动态内存分配(例如dynamic memory management,low level memory management之上,如:: operator new,在许多实现中使用malloc).

请注意,malloc(在C中)和new(在C中)不会创建新变量.如果你编写int * ptr = malloc(100000 * sizeof(int);在C中,或int * ptr = new int [100000];在C …中,它们正在分配新的内存区域,其地址可以转换为一个指针变量.

variable(在C或C中)是一个源代码,它具有一个名称(例如ptr或x000002或此答案中的数组)和scope.在执行期间,只有位置很重要(并且变量不存在).阅读约memory addresses(几乎所有地点).

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

int x000001;
int x000002;

等等.您可能可以生成(使用其他程序)如此庞大的C或C源文件,例如:取决于:

////etc
int x999998;
int x999999;

但即使您生成了40亿行源C文件,您也无需耐心编译它.如果你这样做,编译肯定会失败(至少在link时,我将其视为整个程序编译的一部分).

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

/// one single variable,but a huge one
int array[4294967296];

声明一个名为array的变量.再次,这将无法编译和link(如果变量是某个函数中的本地变量,那么在运行时你至少会得到一个stack overflow).典型的call stacks限于一个或几兆字节(这是操作系统和计算机相关的).

查看virtual address space wikipage中的图片,了解pointer aliasing的含义以及virtual memory是什么.

实际上,在32位计算机上,虚拟地址空间通常限于例如给定process的3G千兆字节(每个进程运行一些executable并具有自己的虚拟地址空间).详细信息是特定于操作系统在Linux上,使用setrlimit(2) – 可能通过你的bash shell内置的ulimit – 来降低这个限制.

在Linux上,动态内存分配(malloc或new)基于system calls修改虚拟地址空间,特别是mmap(2).这样的调用可能会失败(然后malloc会因为返回NULL而失败,而new会引发异常),并且32位系统,它们将在3Gbytes之前失效.您可能想要禁用memory overcommitment.

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

cat /proc/self/maps
cat /proc/$$/maps

然后了解他们的输出是什么.您可能还应阅读Advanced Linux Programming.

我建议花几天时间阅读:Operating Systems : Three Easy Pieces(可免费下载).

(在Windows或MacOSX或Android上,malloc和new都使用一些操作系统原语来增加虚拟地址空间.我让你找到哪些)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读