C 强制if语句只执行一次

C 强制if语句只执行一次,c,C,我有一段代码将被执行多次(5000+),还有一条if语句,只有第一次才是真的。我曾经想过使用一个“FIRST”变量,每次都比较它,但每次都检查它似乎是一种浪费,即使我知道它不需要 bool FIRST = true; void foo(){ if(FIRST){ /* do something only once */ FIRST = false; } /* something something... */ } 我也不知道是否有一些编译器优化可以自动实现这一点,或者用另一

我有一段代码将被执行多次(5000+),还有一条if语句,只有第一次才是真的。我曾经想过使用一个“FIRST”变量,每次都比较它,但每次都检查它似乎是一种浪费,即使我知道它不需要

bool FIRST = true;

void foo(){
if(FIRST){
   /* do something only once */
   FIRST = false;
}
   /* something something... */
}
我也不知道是否有一些编译器优化可以自动实现这一点,或者用另一种方式实现这一点;如果有,请告诉我


是的,我知道一个if语句并不是什么大事,但它让我很恼火。

如果您使用的是gcc,那么有一些名为
不太可能
可能
的宏可以允许它根据条件进行优化

在您的情况下,条件仅在第一次为真,因此您将使用
不太可能

if (unlikely(FIRST)) {

从编译器优化的角度来看,我认为
if
语句是最好的选择,因为它可能会编译成一个类似于单个的语句,所以只要
FIRST
保持为true,它就会得到相当好的优化


您可能还想先看看

Make
foo
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)