在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_2LBB0_3标签之间)做更多的工作。

关于c++ - 什么是混叠?混叠如何影响性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9709261/

10-11 14:54