正如 MSalters 已经非常粗暴地指出的那样,它不太可能有帮助。此外,几乎无法预测它是否有帮助。我为您创建了两个示例,您可以在其中看到 - 一个使用指针数组,第二个使用 if-else-clause。
Example 1
#include <array>
#include <functional>
int test1(int* i)
{
return *i * *i * *i;
}
int test2(int* i)
{
return *i * *i* *i* *i* *i* *i;
}
std::array<int (*)(int*), 2> funcs{test1, test2};
int testing(int v)
{
int testme = v + 4 ;
return funcs[v](&testme);
}
及其组件
test1(int*): # @test1(int*)
movl (%rdi), %ecx
movl %ecx, %eax
imull %ecx, %eax
imull %ecx, %eax
retq
test2(int*): # @test2(int*)
movl (%rdi), %ecx
movl %ecx, %eax
imull %ecx, %eax
imull %ecx, %eax
imull %eax, %eax
retq
testing(int): # @testing(int)
pushq %rax
leal 4(%rdi), %eax
movl %eax, 4(%rsp)
movslq %edi, %rax
leaq 4(%rsp), %rdi
callq *funcs(,%rax,8)
popq %rcx
retq
funcs:
.quad test1(int*)
.quad test2(int*)
这里是Example2
int test1(int* i)
{
return *i * *i * *i;
}
int test2(int* i)
{
return *i * *i* *i* *i* *i* *i;
}
int testing(int v)
{
int testme = v + 4 ;
return (v == 0) ? test1(&testme) : test2(&testme);
}
与其对应的程序集
test1(int*): # @test1(int*)
movl (%rdi), %ecx
movl %ecx, %eax
imull %ecx, %eax
imull %ecx, %eax
retq
test2(int*): # @test2(int*)
movl (%rdi), %ecx
movl %ecx, %eax
imull %ecx, %eax
imull %ecx, %eax
imull %eax, %eax
retq
testing(int): # @testing(int)
leal 4(%rdi), %eax
movl %eax, %ecx
imull %eax, %ecx
imull %eax, %ecx
testl %edi, %edi
movl $1, %eax
cmovnel %ecx, %eax
imull %ecx, %eax
retq
在指令计数方面它们非常相似(也许专家可以在这里帮助我们并进一步解释)。 if-else-statement 中断了这条指令cmovnel。我怀疑它会产生很大的不同。
我认为您将始终必须在您的确切设置中进行测量。在示例情况下,编译器优化总是难以预测。
这里不可能有真假答案。