繁体   English   中英

编译器是否可以优化在堆上分配静态数组的内存管理?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM