Clang 3.6 이 다음 프로그램의 버전 a
과 동일한 어셈블리를 생성 할 수없는 이유는 무엇 b
입니까?
#include <iostream>
#include <algorithm>
int main(int argc, char** argv)
{
std::cout << std::max(3, argc) << std::endl; // a
//std::cout << std::max({3, argc}) << std::endl; // b
return 0;
}
로 컴파일 된 및 각각에 -O3
대한 관련 어셈블리 비트 는 다음 a
과 b
같습니다.
##a
cmpl $2, %edi
movl $3, %esi
cmovgl %edi, %esi
movq __ZNSt3__14coutE@GOTPCREL(%rip), %rdi
##b
movq ___stack_chk_guard@GOTPCREL(%rip), %r15
movq (%r15), %r15
movq %r15, -32(%rbp)
leaq -40(%rbp), %rcx
movl $3, -40(%rbp)
leaq -36(%rbp), %rax
movl %edi, -36(%rbp)
movl $3, %esi
leaq -32(%rbp), %r8
movq %rcx, %rdx
jmp LBB0_1
.align 4, 0x90
LBB0_2:
movl (%rbx), %edi
movq %rax, %rcx
movq %rbx, %rax
LBB0_1:
cmpl %edi, %esi
cmovlq %rax, %rdx
movq %rcx, %rbx
addq $8, %rbx
cmpq %r8, %rbx
movl (%rdx), %esi
jne LBB0_2
movq __ZNSt3__14coutE@GOTPCREL(%rip), %rdi
어셈블리에 대한 제한된 지식으로 볼 때 버전 b
이 std::max_element
알고리즘으로 컴파일 된 것처럼 보이며 a
. 왜 이런거야? 사용할 때 현실적으로 어떤 종류의 최적화를 기대할 수 std::initializer_list
있습니까?
누군가 분명히이 비 효율성을 발견하고 개선 했으므로 clang을 최신 버전으로 업그레이드해야합니다.
다음은 b
이제 예제에서 생성 된 코드입니다 .
movl %edi, %eax
movl $3, (%rsp)
movl %eax, 4(%rsp)
cmpl $3, %eax
cmovlel (%rsp), %eax
원래 예제만큼 깔끔하지는 않지만 3.6 컴파일러에서 생성 한 코드보다 낫습니다.
항상 그렇듯이 컴파일러가 수행하는 최적화 작업은 "저자가 발견하고 수정 한 사항"에 따라 크게 달라집니다. 첫 번째 단계는 "작동하기"입니다. 그런 다음 더 빠르게 / 작게 만드는 방법을 살펴 봅니다.
내 clang 버전 :
clang version 3.7.0
(http://llvm.org/git/clang.git 490122a3730b4ac7120ba9bee3e5dc51510d68d9)
(http://llvm.org/git/llvm.git 1c63fe6c61b2e1d6050f971f26946cda1e708a9c)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다