【发布时间】:2014-08-22 21:17:23
【问题描述】:
有没有办法告诉 gcc 如果两个后续调用具有相同的参数,则只应调用一次具有副作用的函数。我想要以下行为:
foo(6);//run this function
foo(6);//optimize this away
foo(6);//optimize this away
foo(5);//run this function
foo(6);//run this function again
我可以让foo 在全局变量执行任何工作之前对其进行检查,但这并不是最优的。
void inline foo(int i){
static int last_i=i+1;
if(last_i != i){
last_i==i;
//do_work...
}
}
由于foo 是一个内联函数,编译器应该能够查看foo() 的调用并看到它不必执行它。问题是编译器不能像全局变量那样优化,有没有办法让编译器知道这样做是安全的?
【问题讨论】:
-
假设您可以以某种方式告诉编译器为您执行此操作。如果不将最后使用的参数保存在全局变量中,您认为它将如何实现?您对这种技术的反对意见究竟是什么?在您看来,它“不是最理想的”是什么?
-
类似属性((const))的东西?
-
一个有副作用的函数不是const。
-
这必须是一个相当繁重的函数来证明开销是合理的,但是您可以将数字存储在一个集合中,并有条件地执行它们......该集合在方法中可能是静态的......
-
您可以在编译前通过
uniq运行该代码块(在去掉 cmets 之后)。