在GoingNative事件中,第2天的Interactive Panel(9分钟),Chandler Carruth说:
这是什么意思?可以用一个(简单的)例子来说明吗?
最佳答案
混叠通过阻止编译器进行某些优化来影响性能。例如:
void foo(int *array,int *size,int *value) {
for(int i=0;i<*size;++i) {
array[i] = 2 * *value;
}
}
查看此代码,您可能希望编译器可以在循环外加载一次
*value
,然后很快将数组中的每个元素设置为该值。但这不是由于别名造成的。因为*value
可以作为数组元素的别名,所以它可以在任何给定的迭代中更改。因此,代码必须在每次迭代中加载该值,从而可能会导致速度变慢。如果变量不能别名,则上面的代码将等效于以下内容:
void foo(int *array,int size,int value) {
for(int i=0;i<size;++i) {
array[i] = 2 * value;
}
}
使用LLVM的online demo获取生成的代码,以下是不同的结果:
1)使用别名
foo: # @foo
.cfi_startproc
# BB#0:
cmpl $0, (%rsi)
jle .LBB0_3
# BB#1:
xorl %eax, %eax
.align 16, 0x90
.LBB0_2: # %.lr.ph
# =>This Inner Loop Header: Depth=1
movl (%rdx), %ecx
addl %ecx, %ecx
movl %ecx, (%rdi,%rax,4)
incq %rax
cmpl (%rsi), %eax
jl .LBB0_2
.LBB0_3: # %._crit_edge
ret
.size foo, .Ltmp1-foo
.cfi_endproc
.Leh_func_end0:
2)不带别名
foo: # @foo
.cfi_startproc
# BB#0:
testl %esi, %esi
jle .LBB0_3
# BB#1: # %.lr.ph
addl %edx, %edx
.align 16, 0x90
.LBB0_2: # =>This Inner Loop Header: Depth=1
movl %edx, (%rdi)
addq $4, %rdi
decl %esi
jne .LBB0_2
.LBB0_3: # %._crit_edge
ret
.size foo, .Ltmp1-foo
.cfi_endproc
.Leh_func_end0:
您可以看到带有别名的版本必须在循环体内(在
LBB0_2
和LBB0_3
标签之间)做更多的工作。关于c++ - 什么是混叠?混叠如何影响性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9709261/