Voi*_*ler 3 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
Run Code Online (Sandbox Code Playgroud)
现在的问题是:编译器是否优化了这一点,以便它们重用现有的内存块,而不是分配第二个内存块,如果编译器知道第一个块不会被再次引用?
如果是这样:这是否也适用于动态内存分配?如果内存在范围之外仍然存在,但是以与示例中给出的方式相同的方式使用,这也是可能的吗?我认为这只有在设置和foo在同一个c文件中实现(与调用代码存在于同一个对象中)时才有效吗?
编译器会优化它
只有在询问特定编译器时才能回答这个问题.通过检查生成的代码可以找到答案.
如果编译器知道第一个块不会被再次引用,那么它们会重用现有的内存块,而不是分配第二个内存块?
这样的优化不会改变程序的行为,所以它是允许的.另一个问题是:是否有可能证明内存不会被引用?如果有可能,那么在合理的时间内证明是否容易?我觉得非常安全,说一般不可能证明,但在某些情况下可以证明.
我认为这只有在设置和foo在同一个c文件中实现(与调用代码存在于同一个对象中)时才有效吗?
通常需要证明记忆的不可接触性.理论上,链接时间优化可能会提升这一要求.
这是否也适用于动态内存分配?
理论上,因为它不会改变程序的行为.但是,动态内存分配通常由库执行,因此编译器可能无法证明缺乏副作用,因此无法证明删除分配不会改变行为.
如果内存在范围之外仍然存在,但是以与示例中给出的方式相同的方式使用,这也是可能的吗?
如果编译器能够证明内存泄漏,那么也许.
尽管优化可能是可能的,但它并不是非常重要.节省一点堆栈空间可能对运行时间影响很小.如果数组很大,防止堆栈溢出可能很有用.