Clang이 std :: initializer_list를 최적화 할 수없는 이유는 무엇입니까?

다니엘

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대한 관련 어셈블리 비트 는 다음 ab같습니다.

##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

어셈블리에 대한 제한된 지식으로 볼 때 버전 bstd::max_element알고리즘으로 컴파일 된 것처럼 보이며 a. 왜 이런거야? 사용할 때 현실적으로 어떤 종류의 최적화를 기대할 수 std::initializer_list있습니까?

Mats Petersson

누군가 분명히이 비 효율성을 발견하고 개선 했으므로 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

V8이 try-catch-finally를 최적화 할 수없는 이유는 무엇입니까?

분류에서Dev

std :: vector를 초기화 할 때 템플릿 정수를 사용할 수없는 이유는 무엇입니까?

분류에서Dev

std :: min이 initializer_list 만 지원하는 이유는 무엇입니까?

분류에서Dev

std :: initializer_list의 요소를 복사해야하는 이유는 무엇입니까?

분류에서Dev

rvalue 참조와 값으로 std :: initializer_list를 사용하는 이유는 무엇입니까?

분류에서Dev

std :: initializer_list를 특수화 할 수 있습니까?

분류에서Dev

std :: initializer_list가 할당 매개 변수로 사용될 때 참조 유형이 아닌 이유는 무엇입니까?

분류에서Dev

이 List <List <String >>을 초기화 할 수없는 이유는 무엇입니까?

분류에서Dev

std :: from_chars의 결과를 std :: tie에 할당 할 수없는 이유는 무엇입니까?

분류에서Dev

JSON .Net이 정적 또는 const 멤버 변수를 직렬화 할 수없는 이유는 무엇입니까?

분류에서Dev

C ++에서 std :: initializer_list 요소 유형을 const로 만드는 이유는 무엇입니까?

분류에서Dev

Clang이 std :: complex를 그렇게 빠르게 할당하는 이유는 무엇입니까?

분류에서Dev

최적화가이 함수를 죽이는 이유는 무엇입니까?

분류에서Dev

psvm Java에서 정적 최종 변수를 생성 할 수없는 이유는 무엇입니까?

분류에서Dev

정적 변수를 다른 변수의 값으로 초기화 할 수없는 이유는 무엇입니까?

분류에서Dev

Kotlin에서 ArrayAdapter를 초기화 할 수없는 이유는 무엇입니까?

분류에서Dev

Datareader를 초기화 할 수없는 이유는 무엇입니까?

분류에서Dev

JVM 기반 Lisps에서 테일 호출을 최적화 할 수없는 이유는 무엇입니까?

분류에서Dev

std :: forward가 스스로 템플릿 매개 변수를 추론 할 수없는 이유는 무엇입니까?

분류에서Dev

std :: ostream을 이동할 수없는 이유는 무엇입니까?

분류에서Dev

std :: make_shared의 인스턴스화를 함수에 대한 포인터로 사용할 수없는 이유는 무엇입니까?

분류에서Dev

리터럴 연산자를 정상적으로 템플릿화할 수없는 이유는 무엇입니까?

분류에서Dev

`std :: async`가 올바른 오버로드를 선택할 수없는 이유는 무엇입니까?

분류에서Dev

복사 생성자에서 std :: copy를 사용할 수없는 이유는 무엇입니까?

분류에서Dev

인스턴스화 할 수없고 "Calculate"메서드를 호출 할 수없는 이유는 무엇입니까?

분류에서Dev

List <Item>을 할 수없는 이유는 무엇입니까?

분류에서Dev

nullptr std :: weak_ptr을 반환 할 수없는 이유는 무엇입니까?

분류에서Dev

Java를 설치할 수없는 이유는 무엇입니까?

분류에서Dev

OrderedDict를 셔플 할 수없는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    V8이 try-catch-finally를 최적화 할 수없는 이유는 무엇입니까?

  2. 2

    std :: vector를 초기화 할 때 템플릿 정수를 사용할 수없는 이유는 무엇입니까?

  3. 3

    std :: min이 initializer_list 만 지원하는 이유는 무엇입니까?

  4. 4

    std :: initializer_list의 요소를 복사해야하는 이유는 무엇입니까?

  5. 5

    rvalue 참조와 값으로 std :: initializer_list를 사용하는 이유는 무엇입니까?

  6. 6

    std :: initializer_list를 특수화 할 수 있습니까?

  7. 7

    std :: initializer_list가 할당 매개 변수로 사용될 때 참조 유형이 아닌 이유는 무엇입니까?

  8. 8

    이 List <List <String >>을 초기화 할 수없는 이유는 무엇입니까?

  9. 9

    std :: from_chars의 결과를 std :: tie에 할당 할 수없는 이유는 무엇입니까?

  10. 10

    JSON .Net이 정적 또는 const 멤버 변수를 직렬화 할 수없는 이유는 무엇입니까?

  11. 11

    C ++에서 std :: initializer_list 요소 유형을 const로 만드는 이유는 무엇입니까?

  12. 12

    Clang이 std :: complex를 그렇게 빠르게 할당하는 이유는 무엇입니까?

  13. 13

    최적화가이 함수를 죽이는 이유는 무엇입니까?

  14. 14

    psvm Java에서 정적 최종 변수를 생성 할 수없는 이유는 무엇입니까?

  15. 15

    정적 변수를 다른 변수의 값으로 초기화 할 수없는 이유는 무엇입니까?

  16. 16

    Kotlin에서 ArrayAdapter를 초기화 할 수없는 이유는 무엇입니까?

  17. 17

    Datareader를 초기화 할 수없는 이유는 무엇입니까?

  18. 18

    JVM 기반 Lisps에서 테일 호출을 최적화 할 수없는 이유는 무엇입니까?

  19. 19

    std :: forward가 스스로 템플릿 매개 변수를 추론 할 수없는 이유는 무엇입니까?

  20. 20

    std :: ostream을 이동할 수없는 이유는 무엇입니까?

  21. 21

    std :: make_shared의 인스턴스화를 함수에 대한 포인터로 사용할 수없는 이유는 무엇입니까?

  22. 22

    리터럴 연산자를 정상적으로 템플릿화할 수없는 이유는 무엇입니까?

  23. 23

    `std :: async`가 올바른 오버로드를 선택할 수없는 이유는 무엇입니까?

  24. 24

    복사 생성자에서 std :: copy를 사용할 수없는 이유는 무엇입니까?

  25. 25

    인스턴스화 할 수없고 "Calculate"메서드를 호출 할 수없는 이유는 무엇입니까?

  26. 26

    List <Item>을 할 수없는 이유는 무엇입니까?

  27. 27

    nullptr std :: weak_ptr을 반환 할 수없는 이유는 무엇입니까?

  28. 28

    Java를 설치할 수없는 이유는 무엇입니까?

  29. 29

    OrderedDict를 셔플 할 수없는 이유는 무엇입니까?

뜨겁다태그

보관