C 언어의 restrict 키워드

1452 단어
간단한 소개
restrict는 c99 표준에 도입된 것으로 바늘을 한정하고 제약하는 데만 사용할 수 있으며 바늘은 데이터 대상에 접근하는 유일하고 초기 방식임을 나타낸다.즉 컴파일러에게 이 포인터가 가리키는 메모리의 내용을 수정하는 모든 작업은 이 포인터를 통해 수정해야 하며 다른 경로(기타 변수나 포인터)를 통해 수정할 수 없다는 것을 알려준다.이렇게 하면 컴파일러가 더욱 좋은 최적화 코드를 만들고 더욱 효율적인 어셈블리 코드를 생성하는 데 도움을 줄 수 있다.
restrict에서 수식한 바늘은 주로 함수 참조에 사용되거나,malloc () 로 분배된 메모리 공간을 가리킨다.
GCC에서 어셈블리 명령을 생성하는 예를 통해 이 키워드를 더욱 잘 이해할 수 있습니다
4
  • restrict 키워드 설명이 없는 코드voidf(int*a, int*b, int*c) {*a+=*c;*b+=*c;}위 코드를 파일 코드에 기록합니다.c, 터미널(terminal)에서 gcc-O2 - S code를 입력합니다.c -o code.s참고: "-o2"의 O 및 "-S"의 S는 대문자로 생성된 코드가 필요합니다.s 파일의 내용은 다음과 같습니다.section __TEXT,__text,regular,pure_instructions .macosx_version_min 10, 11 .globl _f .align 4, 0x90 _f: ## @f .cfi_startproc## BB#0: pushq %rbp Ltmp0: .cfi_def_cfa_offset 16 Ltmp1: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp2: .cfi_def_cfa_register %rbp movl (%rdx), %eax addl %eax, (%rdi) movl (%rdx), %eax addl %eax, (%rsi) popq %rbp retq .cfi_endproc
      .subsections_via_symbols
    

  • 이 중 관건적인 어셈블리 명령은 다음과 같습니다: movl (%rdx),%eax addl%eax, (%rdi) movl (%rdx),%eax addl%eax, (%rsi)
    4
  • restrict 키워드 설명이 있는 코드voidf(int*restrict a, int*restrict b, int*restrict c) {*a+=*c;*b+=*c;위와 같은 절차를 통해 어셈블리 명령을 생성합니다: movl (%rdx),%eax addl%eax, (%rdi) addl%eax, (%rsi) 는restrict 키워드 설명이 없는 경우에 비해 두 번째 단계의 바늘 c를 불러옵니다

  • 총결산
    restrict 키워드 성명은 주로 컴파일러가 코드 최적화를 더욱 잘 할 수 있도록 도와주며 실제로는 코드의 작성에 영향을 주지 않는다.

    좋은 웹페이지 즐겨찾기