联盟与阴险的bug

时间:2017-06-29 07:56:12

标签: c++ arrays

当我们想要遍历整个数组并将数组的每个值与数组中存在的数字进行比较时有一个问题,比如arr [0]那么,为什么建议用arr [0]初始化一个int ],比如int acomp = arr [0]并将acomp与数组中存在的每个整数进行比较,而不是将数组中存在的每个整数与arr [0]进行比较? 例如,在下面的联合代码中,我向我指出代码2比代码1更好,但我不太清楚为什么。

perl -V:ivsize

3 个答案:

答案 0 :(得分:5)

这是一个正确性问题。 for循环内的赋值可以修改数组值。您可以修改在分配的比较或右侧使用的元素。这就是为什么你必须在进入循环之前保存它们。

答案 1 :(得分:0)

制作本地副本pid,并且必须在阵列中重复查找值的qid才能进行性能优化。
但是,如果任何现代编译器无法选择并且隐式地进行优化,我会感到惊讶。

答案 2 :(得分:0)

使用https://godbolt.org/可以比较两者。你关心的是循环内的指令。

使用Clang 4.0,程序集是:

  • 代码1

    movsxd  rax, dword ptr [rbp - 16]
    mov     ecx, dword ptr [4*rax + arr]
    movsxd  rax, dword ptr [rbp - 8]
    cmp     ecx, dword ptr [4*rax + arr]
    jne     .LBB0_4
    movsxd  rax, dword ptr [rbp - 12]
    mov     ecx, dword ptr [4*rax + arr]
    movsxd  rax, dword ptr [rbp - 16]
    mov     dword ptr [4*rax + arr], ecx
    
  • 代码2

    movsxd  rax, dword ptr [rbp - 24]
    mov     ecx, dword ptr [4*rax + arr]
    cmp     ecx, dword ptr [rbp - 16]
    jne     .LBB0_4
    mov     eax, dword ptr [rbp - 20]
    movsxd  rcx, dword ptr [rbp - 24]
    mov     dword ptr [4*rcx + arr], eax