C 强制if语句只执行一次
我有一段代码将被执行多次(5000+),还有一条if语句,只有第一次才是真的。我曾经想过使用一个“FIRST”变量,每次都比较它,但每次都检查它似乎是一种浪费,即使我知道它不需要C 强制if语句只执行一次,c,C,我有一段代码将被执行多次(5000+),还有一条if语句,只有第一次才是真的。我曾经想过使用一个“FIRST”变量,每次都比较它,但每次都检查它似乎是一种浪费,即使我知道它不需要 bool FIRST = true; void foo(){ if(FIRST){ /* do something only once */ FIRST = false; } /* something something... */ } 我也不知道是否有一些编译器优化可以自动实现这一点,或者用另一
bool FIRST = true;
void foo(){
if(FIRST){
/* do something only once */
FIRST = false;
}
/* something something... */
}
我也不知道是否有一些编译器优化可以自动实现这一点,或者用另一种方式实现这一点;如果有,请告诉我
是的,我知道一个if语句并不是什么大事,但它让我很恼火。如果您使用的是gcc,那么有一些名为
不太可能和可能的宏可以允许它根据条件进行优化
在您的情况下,条件仅在第一次为真,因此您将使用不太可能:
if (unlikely(FIRST)) {
从编译器优化的角度来看,我认为if
语句是最好的选择,因为它可能会编译成一个类似于单个的语句,所以只要FIRST
保持为true,它就会得到相当好的优化
您可能还想先看看Makefoo
和foo
,然后像这样调用
fooFirst();
for (...) {
foo();
}
foo
和fooFirst
可以共享代码。您可以通过函数指针调用函数,并删除if
通过将函数指针更改为不带if
的函数来检查第二次调用:
void foo_init(void);
void foo_real(void);
void (*foo)(void) = foo_init;
void foo_init(void) {
foo = foo_real;
/* do something only once */
foo_real();
}
void foo_real(void) {
/* something something... */
}
int main() {
foo();
foo();
}
在这种情况下,我们仍然需要先设置为false?无法理解它是如何工作的…@NickS代码的其余部分没有改变。所有这些只是告诉编译器,条件在大多数情况下都是假的,并针对这种情况进行优化。也许您可以重构代码,使第一个情况不在循环中?为什么需要测试?该函数只有在foo==foo_init
Och right时才会被调用,因此可以将其删除。我想我是在考虑让函数线程安全——然后在函数体中加上一个互斥体,检查是否需要(foo==foo\u init)
。