堆栈上保留的数组大小是否影响除内存使用之外的任何其他资源?

时间:2016-01-28 05:07:24

标签: c++ c++builder

这仅仅是出于兴趣,我个人使用C ++ Builder 2009

假设我分配:wchar_t Buffer[32]或我分配wchar_t Buffer[512]

第二个调用会分配更多内存,因此您可能会认为第二个调用在内存使用方面更为昂贵。

但是,通过这种方式分配更多内存是否还有其他因素?是否涉及更多说明? CPU使用率更高?

只是想知道?

5 个答案:

答案 0 :(得分:3)

  

但是,通过这种方式分配更多内存还有其他可能影响吗?

可能存在一个相关的副作用:当您为缓冲区分配更多内存时,会增加程序需要访问的堆栈页面将被分割到更多缓存行的可能性,这可能最终意味着CPU必须等待因为否则不会发生的缓存未命中。请注意,这里没有特别的理由认为您正在使用更多的缓冲区:"问题"是因为CPU可能会被要求在缓冲区之前和之后获取数据,并且所有这些都可以分成更多的缓存行。缓冲区周围的这些堆栈页面可能经常被访问,以便将它们保存在缓存中,但是这样做可能会弹出一段暂时未使用的缓存内容, if 那时候你需要一个缓存未命中。缓存行的粒度(每个"页面")的字节数也会影响这种情况。

这通常是无关紧要的,但你问......; - )。

  

是否涉及更多指示?

不再涉及指示。

  

更多CPU使用率?

等待缓存的时间是"使用"。

答案 1 :(得分:2)

这是''分配''堆栈内存。所有这些都需要调整堆栈指针。如果您编写如下函数:

void foo()
{
    char c[32];
    ...
}

生成的程序集看起来像(在64位计算机上):

.cfi_startproc
pushq   %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16 
movq    %rsp, %rbp
.cfi_def_cfa_register 6
subq    $48, %rsp        // This is the actual "allocation" on the stack

如果将其更改为char c[512],则唯一可以改变的是:

subq    $528, %rsp // Allocation of 512 bytes on stack

CPU指令或时间没有区别。唯一的区别是第二个使用了更多有限的堆栈内存。

答案 2 :(得分:1)

通过分配更多大小,指令不会有任何差异。 堆栈存储器在编译时也是已知的,编译器会生成所需的指令。

例如::

int main()
{
    char Buffer[1024] ;
    char Buffer2[ 512] ;
 return 0 ;
}

00981530  push        ebp  
00981531  mov         ebp,esp  
00981533  sub         esp,6DCh   //6dch = 1756  just the esp is adjusted to allocate more memory
00981539  push        ebx  

int main()
{
    char Buffer[32] ;
    char Buffer2[ 512] ;
  return 0 ;
}

00D51530  push        ebp  
00D51531  mov         ebp,esp  
00D51533  sub         esp,2FCh  //2fch = 764 now the esp is adjusted to 764 without any instruction change.
00D51539  push        ebx  

是否涉及更多说明? 不,你可以看到上面的例子:)

更多CPU使用率? 不,因为执行了相同数量的指令

更多内存使用情况? 是的,因为分配了更多的堆栈内存。

答案 3 :(得分:1)

在操作系统中,名为动态加载的内存管理实现仅在调用例程时加载例程,而不是将程序中的所有例程加载到主内存中。当例程加载其所有元素时#39;必须将地址加载到页表中以进行地址转换。对应于特定地址的内容将加载到名为page的单元中。

页面大小通常为2kb或4kb的较小订单。如果内容超出页面大小,则会将其拆分并占用多个页面。发生page fault时,会加载新内容,将基于page replacement policies的旧内容覆盖到交换空间。当再次需要替换内容时,MMU将再次将内容从交换空间加载到页面。这个

让我们想一想如果加载和交换涉及更大的内容会发生什么,这是一个性能问题并涉及一些cpu周期。

根据您的问题,它不会对大小为32或512的wchar_t数组产生影响。但是,一个大小以兆字节为单位的不同数据结构以及数千个这种结构的数组将使对内存和CPU有一些影响。我建议你看看here

答案 4 :(得分:0)

我认为如果你在相同程度上调用第一个,意味着相同数量的位,那么使用wchar_t Buffer[512]会更好,因为它需要更长时间,我相信,它会使用更多资源开始呼叫退出,然后启动另一个,然后继续。但是第二个你有一个开始然后它与这个任务联系在一起,只要你不想做任何其他事情一段时间就可以了。希望有所帮助。