[英]can the compiler optimize the memory management allocating a static array on the heap?
我想在数据段中分配一个大的char数组,所以我使用了一些像这样的代码:
const int size = 1000000000 ;
static char chr [ size ] ;
int main ( )
{
chr [ size - 1 ] = 1 ; // line 1
string s ;
cin >> s ; // line 2
}
第1行:我放置了这一行,以便该数组至少使用一次,并且没有从编译器中进行优化
第2行:为了停止执行并检查内存占用,例如:在Windows的任务管理器中
在Windows系统上,结果是当程序停留在第2行上等待用户输入时,在任务管理器上(在“内存”和“工作集”的两列中),该进程使用的内存量远远少于预期的1GB 。
然后,我尝试使用以下代码:
int main ( )
{
for ( int i = 0 ; i < size ; ++ i )
{
chr [ i ] = i ;
}
string s ;
cin >> s ; // line 2
}
现在,当程序到达第2行时,经过几秒钟的快速增长,内存使用量达到了预期的1GB。
似乎内存是动态分配的,而不是静态分配的。
我对数组/内存模型的理解错误吗?
编译器是否动态分配大量数据以进行优化?
任务管理器是否显示物理分配的内存,因此1GB最初会在硬盘驱动器上分配,直到首次使用?
操作系统仅在访问内存后才分配内存。 了解有关需求分页的信息。
您正在分配虚拟内存。
如果您实际上不使用它,则不必将其存储在任何地方。
由于您实际上并没有使用数组(删除数组不会影响程序的输出,因此编译器可以自由地对其进行优化。有些系统采用一种惰性分配形式:它们不分配(并收取费用)直到真正访问它们为止的整个过程;即使不进行优化,也只能触摸单个页面(可以说,在懒散分配的系统上,您无法拥有一致的C或C ++实现。 Windows和Linux有罪,我们必须忍受它。)
编译器是否动态分配大量数据以进行优化?
不,不!
编译器永远不会那样做优化。
只有显式动态分配的内存才会进入freestore(或堆)
当你做
const int size = 1000000000 ;
static char chr [ size ] ;
在全局范围内,使用的内存甚至不是堆栈内存,使用的内存是数据段或BSS段,但是,C ++标准未指定应将其分配在何处,而是留作内部实现的编译器,但绝对不会在freestore(aka堆)上分配
另外,请勿使用任务管理器来分析C ++程序的内存使用情况,尤其是使用性能分析工具来执行此操作。任务管理器显示的内容不是真正的wrt程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.