编译器将 malloc/free 或 new/delete 对优化为 alloca
Will Compiler optimize malloc/free or new/delete pair into alloca
有没有成熟的C/C++编译器,能够优化malloc
/free
(或new
/delete
)对信息alloca
?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于某些有限的情况)。
只有当两个函数位于同一函数中(甚至在同一{}
块中)时,才允许对 malloc/free 对进行这种优化,并且每次调用 malloc 时都会调用 free。另外,让我们考虑指向错误定位内存的指针未保存在某个全局变量中。
那么,GCC/LLVM+clang/Intel Compiler 会转换这样的代码块吗?
{
char *carray;
carray = malloc(100); // or malloc(N)
// some string-like work with carray
free(carray);
}
到
{
char*carray;
carray = alloca(100); // or if(N<const1) carray=alloca(N);else carray=malloc(N)
// the same work
// nothing // or if(N>=const1) free(carray)
}
这种转换可能对每个程序都不是很有用,但我认为,可能有一些特殊的编译器选项。
PS (update1) 我们可以将讨论限制在编译器知道 malloc 和 free 来自 libc (stdlib) 的情况
LLVM有一个分支叫做poolalloc,可以进行这种优化。它作为SAFECode的一部分进行维护,不在主线LLVM发行版中。
它在Chris Lattner的博士论文和这篇PLDI论文中都有描述。代码在这里。
从技术上讲,编译器可以优化任何内容,只要它们遵循 As-If 规则。
因此,优化堆分配到堆栈分配是可能的,但编译器需要足够智能来探测用法并确定将分配更改为堆栈不会影响程序的可观察行为。
我不知道有任何编译器可以做到这一点。
相关文章:
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化