确定如果检查

时间:2015-02-17 16:34:05

标签: c if-statement

在函数中考虑这种if-statment:

int Foo( void )
{
    if ( HostCPUInfo::IsSSE3Supported() )
        // SSE3 intrinsic
    else
        // C code
}

我在运行期间检查主机CPU是否支持SSE3指令以允许使用更快的内部。但是,由于我怀疑HostCPUInfo :: IsSSE3Supported()的返回会在我的程序生命周期中发生变化,有没有办法只进行一次这种检查(可能在初始化期间)?

3 个答案:

答案 0 :(得分:4)

这是函数指针的一种方法:

int (*foo)() = synthetic_foo;

void init() {
    if (HostCPUInfo::IsSSE3Supported()) {
        foo = sse3_foo;
    }
}

答案 1 :(得分:1)

您可以使用初始化为执行测试的函数的函数指针。这样,在使用foo()

之前,您不必调用特殊的初始化函数
int foo_init (void);
int foo1 (void);
int foo2 (void);

int (*Foo) (void) = foo_init;

int foo_init (void)
{
  Foo = (HostCPUInfo::IsSSE3Supported() ? foo1 : foo2);
  return Foo();
}

...

int main (void)
{
  Foo();

  ...
}

如果编译器无法内联foo函数,则此可能会影响性能。

答案 2 :(得分:0)

在输入HostCPUInfo::IsSSE3Supported()之前检查Foo一次,并根据返回值设置一些布尔值。

然后在Foo中仅检查该布尔值,无论HostCPUInfo::IsSSE3Supported()的返回值是否发生变化,该布尔值始终保持不变。