4

我有一段将被执行多次(5,000+)的代码,以及一个仅在第一次为真的 if 语句。我曾想过使用“FIRST”变量并每次进行比较,但每次检查它似乎都是一种浪费,即使我知道它不需要。

bool FIRST = true;

void foo(){
if(FIRST){
   /* do something only once */
   FIRST = false;
}
   /* something something... */
}

我也不知道是否有一些编译器优化可以自动执行此操作,或者以其他方式执行此操作;如果有,请告诉我。

是的,我知道仅仅一个 if 语句并不是一件大事,但这只是让我烦恼。

4

4 回答 4

6

如果您使用 gcc,则会调用宏unlikely,并且likely可以允许它根据条件进行优化。

在你的情况下,条件只会在第一次为真,所以你会使用unlikely

if (unlikely(FIRST)) {
于 2020-07-30T23:47:54.563 回答
4

从编译器优化的角度来看,我认为if语句是你最好的选择,因为它可能会编译成类似 single 的东西JNZ,所以只要FIRST保持真实,它就会得到相当优化。

您可能还想看看这个线程

于 2020-07-30T23:50:00.297 回答
3

制作fooand fooFirst,然后像这样调用

fooFirst();
for (...) {
   foo();
}

foo并且fooFirst可以共享代码。

于 2020-07-30T23:50:25.880 回答
3

您可以通过函数指针调用函数,并通过将函数指针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();
}
于 2020-07-30T23:59:35.157 回答