C 컴파일러는 루프를 실행하여 최적화합니다.

아리엘

C 컴파일러가 루프를 실행하여 최적화 할 수 있습니까?

예를 들면 :

int num[] = {1, 2, 3, 4, 5}, i;
for(i = 0; i < sizeof(num)/sizeof(num[0]); i++) {
  if(num[i] > 6) {
    printf("Error in data\n");
    exit(1);
  }
}

프로그램이 실행될 때마다 이것을 실행하는 대신 컴파일러가 이것을 실행하고 최적화 할 수 있습니까?

5gon12eder

한번 보시죠 ... (이것이 유일한 방법입니다.)

주먹, 나는 당신의 스 니펫을 우리가 실제로 컴파일하고 실행을 시도 할 수있는 것으로 변환하고 main.c.

#include <stdio.h>

static int
f()
{
  const int num[] = {1, 2, 3, 4, 5};
  int i;
  for (i = 0; i < sizeof(num) / sizeof(num[0]); i++)
    {
      if (num[i] > 6)
        {
          printf("Error in data\n");
          return 1;
        }
    }
  return 0;
}

int
main()
{
  return f();
}

실행 gcc -S -O3 main.c하면 다음 어셈블리 파일 ( main.s)이 생성됩니다.

        .file   "main.c"
        .section        .text.unlikely,"ax",@progbits
.LCOLDB0:
        .section        .text.startup,"ax",@progbits
.LHOTB0:
        .p2align 4,,15
        .globl  main
        .type   main, @function
main:
.LFB22:
        .cfi_startproc
        xorl    %eax, %eax
        ret
        .cfi_endproc
.LFE22:
        .size   main, .-main
        .section        .text.unlikely
.LCOLDE0:
        .section        .text.startup
.LHOTE0:
        .ident  "GCC: (GNU) 5.1.0"
        .section        .note.GNU-stack,"",@progbits

어셈블리를 모르더라도 문자열 "Error in data\n"이 파일에 존재 하지 않는다는 것을 알 수 있으므로 분명히 어떤 종류의 최적화가 수행되었을 것입니다.

main함수에 대해 생성 된 기계 명령어를 자세히 살펴보면

xorl    %eax, %eax
ret

우리는 EAX 레지스터를 XOR (항상 0이 됨)하고 그 값을 EAX에 쓰는 것임을 알 수 있습니다. 그런 다음 다시 돌아옵니다. EAX 레지스터는 반환 값을 유지하는 데 사용됩니다. 보시다시피이 f기능은 완전히 최적화되었습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

여기서 컴파일러는 어떤 루프 최적화를 수행합니까?

분류에서Dev

컴파일러가 주장하는 while 루프 최적화

분류에서Dev

C 컴파일러가 i = i ++를 컴파일하는 것이 합법적입니까? as system ( "rm -rf /") ;?

분류에서Dev

C ++ 프로그램 컴파일러는 g ++ 명령으로 컴파일 한 후 자동으로 exe 파일을 실행합니다.

분류에서Dev

컴파일러는 고정 크기 배열로 구조를 반환하는 함수를 최적화합니까?

분류에서Dev

Bruce의 C 컴파일러로 컴파일하여 8086 프로세서에서 실행되는 asm 파일을 얻는 방법

분류에서Dev

C에서 루프를 여러 번 실행하는 방법은 무엇입니까?

분류에서Dev

C ++ 컴파일러가 사용하지 않는 참조 변수를 최적화하지 않는 이유는 무엇입니까?

분류에서Dev

C 컴파일러는 초기화되지 않은 변수를 사용하여 어떻게 처리합니까?

분류에서Dev

내 GCC 컴파일러가 C 코드를 컴파일하지 않는 이유는 무엇입니까?

분류에서Dev

`using namespace std;`는 무엇이며 최근 C ++ 컴파일러로 프로그램을 컴파일하는 데 왜 필요합니까?

분류에서Dev

C 컴파일러는 LLVM으로 Coreutils를 빌드하는 동안 실행 파일을 만들 수 없습니다.

분류에서Dev

C ++ 컴파일러 최적화는 범위가 끝나기 전에 사용하지 않는 데이터 구조를 지울 수 있습니까?

분류에서Dev

C ++ 초보자 : 컴파일러가 루프를 기반으로 "이름을 찾을 수 없음"을 반환하는 이유는 무엇입니까?

분류에서Dev

독점 드라이버가 컴파일러를 실행하여 설치하는 이유는 무엇입니까?

분류에서Dev

GCC와 같은 C / C ++ 컴파일러는 일반적으로 2의 상수 제곱으로 모듈로를 최적화합니까?

분류에서Dev

C 컴파일러는 스택 사용을 최소화하기 위해 어셈블리의 기능을 최적화합니까?

분류에서Dev

C ++는 정렬되지 않은 여러 맵에 대해 루프를 실행합니다.

분류에서Dev

노틸러스를 사용하여 C ++ 실행 파일 실행

분류에서Dev

C 컴파일러는 실행 파일을 만들 수 없습니다.

분류에서Dev

buildozer-C 컴파일러는 실행 파일을 만들 수 없습니다.

분류에서Dev

buildozer-C 컴파일러는 실행 파일을 만들 수 없습니다.

분류에서Dev

C 컴파일러는 실행 파일을 만들 수 없습니다.

분류에서Dev

C 컴파일러는 실행 파일을 만들 수 없습니다.

분류에서Dev

libpng : C 컴파일러는 실행 파일을 만들 수 없습니다.

분류에서Dev

최신 C ++ 컴파일러가 자동으로 지역 변수를 0으로 초기화한다는 것이 사실입니까?

분류에서Dev

C 컴파일러를 처음부터 컴파일 한 다음 처음부터 Unix / Linux를 컴파일하는 방법

분류에서Dev

이 C ++ 프로그램이 일부 컴파일러에서는 작동하지만 다른 컴파일러에서는 작동하지 않는 이유는 무엇입니까? C ++ 컴파일러의 주요 차이점은 무엇입니까?

분류에서Dev

동적 인수를 사용하여 일반 확장 메서드를 호출 할 때 C # 컴파일러가 잘못된 오류와 함께 실패합니다.

Related 관련 기사

  1. 1

    여기서 컴파일러는 어떤 루프 최적화를 수행합니까?

  2. 2

    컴파일러가 주장하는 while 루프 최적화

  3. 3

    C 컴파일러가 i = i ++를 컴파일하는 것이 합법적입니까? as system ( "rm -rf /") ;?

  4. 4

    C ++ 프로그램 컴파일러는 g ++ 명령으로 컴파일 한 후 자동으로 exe 파일을 실행합니다.

  5. 5

    컴파일러는 고정 크기 배열로 구조를 반환하는 함수를 최적화합니까?

  6. 6

    Bruce의 C 컴파일러로 컴파일하여 8086 프로세서에서 실행되는 asm 파일을 얻는 방법

  7. 7

    C에서 루프를 여러 번 실행하는 방법은 무엇입니까?

  8. 8

    C ++ 컴파일러가 사용하지 않는 참조 변수를 최적화하지 않는 이유는 무엇입니까?

  9. 9

    C 컴파일러는 초기화되지 않은 변수를 사용하여 어떻게 처리합니까?

  10. 10

    내 GCC 컴파일러가 C 코드를 컴파일하지 않는 이유는 무엇입니까?

  11. 11

    `using namespace std;`는 무엇이며 최근 C ++ 컴파일러로 프로그램을 컴파일하는 데 왜 필요합니까?

  12. 12

    C 컴파일러는 LLVM으로 Coreutils를 빌드하는 동안 실행 파일을 만들 수 없습니다.

  13. 13

    C ++ 컴파일러 최적화는 범위가 끝나기 전에 사용하지 않는 데이터 구조를 지울 수 있습니까?

  14. 14

    C ++ 초보자 : 컴파일러가 루프를 기반으로 "이름을 찾을 수 없음"을 반환하는 이유는 무엇입니까?

  15. 15

    독점 드라이버가 컴파일러를 실행하여 설치하는 이유는 무엇입니까?

  16. 16

    GCC와 같은 C / C ++ 컴파일러는 일반적으로 2의 상수 제곱으로 모듈로를 최적화합니까?

  17. 17

    C 컴파일러는 스택 사용을 최소화하기 위해 어셈블리의 기능을 최적화합니까?

  18. 18

    C ++는 정렬되지 않은 여러 맵에 대해 루프를 실행합니다.

  19. 19

    노틸러스를 사용하여 C ++ 실행 파일 실행

  20. 20

    C 컴파일러는 실행 파일을 만들 수 없습니다.

  21. 21

    buildozer-C 컴파일러는 실행 파일을 만들 수 없습니다.

  22. 22

    buildozer-C 컴파일러는 실행 파일을 만들 수 없습니다.

  23. 23

    C 컴파일러는 실행 파일을 만들 수 없습니다.

  24. 24

    C 컴파일러는 실행 파일을 만들 수 없습니다.

  25. 25

    libpng : C 컴파일러는 실행 파일을 만들 수 없습니다.

  26. 26

    최신 C ++ 컴파일러가 자동으로 지역 변수를 0으로 초기화한다는 것이 사실입니까?

  27. 27

    C 컴파일러를 처음부터 컴파일 한 다음 처음부터 Unix / Linux를 컴파일하는 방법

  28. 28

    이 C ++ 프로그램이 일부 컴파일러에서는 작동하지만 다른 컴파일러에서는 작동하지 않는 이유는 무엇입니까? C ++ 컴파일러의 주요 차이점은 무엇입니까?

  29. 29

    동적 인수를 사용하여 일반 확장 메서드를 호출 할 때 C # 컴파일러가 잘못된 오류와 함께 실패합니다.

뜨겁다태그

보관