【发布时间】:2019-04-21 17:47:35
【问题描述】:
我遇到了这样一种情况:优化对realloc 的不必要调用会很有用。然而,似乎 Clang 和 GCC 都没有做这样的事情 (Compiler Explorer (godbolt.org)) - 尽管我看到多次调用 malloc 进行了优化。
例子:
void *myfunc() {
void *data;
data = malloc(100);
data = realloc(data, 200);
return data;
}
我希望它可以优化为如下内容:
void *myfunc() {
return malloc(200);
}
为什么 Clang 和 GCC 都没有优化它? - 他们不允许这样做吗?
【问题讨论】:
-
如果允许编译器删除对外部函数的调用,我会感到非常惊讶。如果您链接到自己的实现
malloc的库怎么办? -
@Gerhardh malloc 不是外部函数,它是标准库的一部分。允许编译器内联它或以其他方式实现它。
-
@Lundin:如果函数包含任何副作用,则不允许编译器优化函数调用,这是不正确的。不允许编译器优化可观察到的行为。如果无法观察到副作用(及其后果),则可以将其移除。
-
@Lundin 有道理,但是,为什么连续两次调用 malloc/free 被优化了(godbolt.org/z/gBVXcp)?如果它有副作用,那是不允许的,不是吗?
-
@Lundin:不需要观察不到的副作用。
标签: c gcc clang language-lawyer compiler-optimization