在函数中考虑这种if-statment:
int Foo( void )
{
if ( HostCPUInfo::IsSSE3Supported() )
// SSE3 intrinsic
else
// C code
}
我在运行期间检查主机CPU是否支持SSE3指令以允许使用更快的内部。但是,由于我怀疑HostCPUInfo :: IsSSE3Supported()的返回会在我的程序生命周期中发生变化,有没有办法只进行一次这种检查(可能在初始化期间)?
答案 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()
的返回值是否发生变化,该布尔值始终保持不变。