我来自 GC VM 环境 (Clojure),其中应用程序可用的内存量是 JVM 启动时使用的内存量,它总是(通常)比机器上的实际可用内存少得多。
我想知道,作为一种系统编程语言,C++ 是否可以自动访问系统上所有 GB 的 RAM?
我知道栈内存区域会被限制,但是堆呢?
例如,考虑需要几亿长的 double 列表的奇怪场景。一些看似过度的内存分配是这样的:
auto pvec=new std::vector<double>(125000000);
如果每个 double
这大约是 1 GB 的内存是8个字节。在具有 16 GB RAM 的机器上,这不是问题吗?
I am wondering if, as a system programming language, C++ just automatically has access to all the GB of RAM on a system?
那不是编程语言的问题,而是内存保护的问题。
在现代计算机上,CPU 与操作系统一起实现所谓的虚拟内存,这是您正在运行的进程的地址范围。在该地址范围内,可以映射物理 RAM,并且通常只映射成小块。一个普通的程序永远没有机会访问不属于它自己进程的内存映射的内存,并且虚拟内存地址不会说明映射到它的物理 RAM。
但是,如果您使用 C++ 或任何其他语言在没有内存保护的裸机上进行编码,那么您的程序将可以访问所有 RAM;请注意,对于您认为的“正常”程序而言,情况绝非如此(我可以告诉您您不是微 Controller 或操作系统开发人员)。