c++ - 编译器内存优化 - 重用现有 block

标签 c++ c memory-management compiler-optimization

假设我要分配 2 个内存块。 我使用第一个内存块来存储一些东西并使用这个存储的数据。 然后我使用第二个内存块做类似的事情。

{
int a[10];
int b[10];

setup_0(a);
use_0(a);

setup_1(b);
use_1(b);    
}

 || compiler optimizes this to this?
 \/

{
int a[10];

setup_0(a);
use_0(a);

setup_1(a);
use_1(a);  
}

// the setup functions overwrites all 10 words

现在的问题是:如果编译器知道第一个 block 不会被再次引用,编译器是否优化它,以便它们重用现有的内存块,而不是分配第二个内存块?

如果这是真的: 这也适用于动态内存分配吗? 如果内存持续存在于范围之外,但以与示例中给出的方式相同的方式使用,这是否也可能? 我假设这仅在 setup 和 foo 在同一个 c 文件中实现(与调用代码存在于同一个对象中)时才有效?

最佳答案

Do compiler optimize this

这个问题只有在你询问特定的编译器时才能得到回答。通过检查生成的代码可以找到答案。

so that they reuse the existing memory blocks, instead of allocating a second one, if the compiler knows that the first block will not be referenced again?

这样的优化不会改变程序的行为,所以它是被允许的。另一个问题是:是否可能证明内存不会被引用?如果可能,那么在合理的时间内证明是否足够容易?我可以很安全地说,一般情况下无法证明,但在某些情况下是可以证明的。

I assume this only works if setup and foo are implemented in the same c file (exist in the same object as the calling code)?

这通常需要证明内存的不可触及性。理论上,链接时间优化可能会提升这一要求。

Does this also work with dynamic memory allocation?

理论上,因为它不会改变程序的行为。但是,动态内存分配通常由库执行,因此编译器可能无法证明没有副作用,因此无法证明删除分配不会改变行为。

Is this also possible if the memory persists outside the scope, but is used in the same way as given in the example?

如果编译器能够证明内存泄漏,那么也许。


即使可能进行优化,也不是很重要。节省一点堆栈空间可能对运行时间影响很小。如果数组很大,它可能有助于防止堆栈溢出。

关于c++ - 编译器内存优化 - 重用现有 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41897268/

相关文章:

c++ - 如何最好地控制迭代方向?

c++ - 基本 C++ 速度(初始化与添加)和比较速度

c++ - 调整大小时数组 "breaks"

c - 获取字符串并转换为 double

c - 在 C 中管理结构队列的最佳方法是什么?

c++ - 为什么分配内存? (C++)

c++ - 保护输入和输出文件描述符时出错

c++ - 如何交换STM32L475闪存中不同存储体的两个存储区域?

Windows内存分配问题

c - 为什么这一行使我的程序出现段错误?