gpt4 book ai didi

c - 声明一个高范围字符数组,但不使用 RAM - 仅当其中有字符时使用

转载 作者:行者123 更新时间:2023-11-30 21:06:16 24 4
gpt4 key购买 nike

我有关于 C 语言(内存)的问题。这是我的来源

#include <unistd.h>

int main() {

char ___storage___[1073741824];

sleep(30);

return 0;
}

RAM 使用量:10 字节
当我运行这个程序时,我期望这个程序从我的电脑内存中获得 1 GB 的空间并持续 30 秒。但它没有从我的电脑内存中得到任何东西!但例如,如果我像这样将字符复制到这个数组中

#include <stdio.h>
#include <unistd.h>

int main() {

char ___storage___[1073741824];

for (int i = 0; i < 536870912; i++) // 512 Mb characters !
___storage___[i] = 'h';

sleep(30);

return 0;
}

RAM 使用量:512 MB
对于这个程序,当我运行它时,这个程序获得了 512 MB 的内存!但我声明了一个大小为(1GB)的变量!为什么 ?如果只有当我们在其中插入一些东西时才获得我们的 PC 内存,为什么我们有动态变量!?例如,我们给出一个动态变量高范围并插入其中,无需动态分配或重新分配!

最佳答案

大多数编译器在堆栈中分配局部变量,但是大多数操作系统将堆栈大小限制在合理的范围内,例如数十到数百兆字节。因此,我们假设它做了一些编译器魔法,隐藏了这个限制,并且不在堆栈中,而是在堆上。

长话短说,您的程序在实际尝试读取或写入大多数内容之前不会获得物理 RAM。这会导致页面错误,该错误由操作系统中称为虚拟内存管理器的组件处理。然后,这会将 RAM 映射到地址空间(程序存储器)的一段,以称为页的单位进行。页面大小因处理器架构而异,但对于 AMD64,它使用 4KB 或 4MB 页面大小,具体取决于操作系统想要执行的操作。

关于c - 声明一个高范围字符数组,但不使用 RAM - 仅当其中有字符时使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com