> 백엔드 개발 > C++ > C `restrict` 키워드의 기능은 무엇이며 코드를 어떻게 최적화합니까?

C `restrict` 키워드의 기능은 무엇이며 코드를 어떻게 최적화합니까?

Patricia Arquette
풀어 주다: 2024-12-26 22:58:17
원래의
753명이 탐색했습니다.

What Does the C   `restrict` Keyword Do and How Does It Optimize Code?

C의 'Restrict' 키워드는 무엇을 의미합니까?

C의 제한 키워드(C 14 이전 구문은 GCC 확장)은 함수에 전달된 두 개 이상의 포인터가 겹치는 메모리를 가리키지 않도록 지정합니다.

C99 표준

C99에서 제한은 컴파일러가 포인터가 서로 별칭을 지정하지 않는다고 가정하여 코드를 최적화하기 위한 것입니다. 이는 다음 예와 같이 루프 풀기 및 벡터화와 같은 최적화를 활성화하여 상당한 성능 향상을 가져올 수 있습니다.

void f(int *a, int *b, int *x) {
  *a += *x;
  *b += *x;
}

void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x) {
  *a += *x;
  *b += *x;
}
로그인 후 복사

제한이 없으면 'x' 값을 로드하려면 두 개의 어셈블리 명령어가 필요합니다. 'a'와 'b'가 모두 있지만 제한을 적용하면 'x' 값은 한 번만 로드됩니다.

GCC 최적화

다음 어셈블리 코드에서 볼 수 있듯이 GCC는 제한을 활용하여 코드를 최적화할 수 있습니다.

f:
    mov    (%rdx),%eax
    add    %eax,(%rdi)
    mov    (%rdx),%eax
    add    %eax,(%rsi)

fr:
    mov    (%rdx),%eax
    add    %eax,(%rdi)
    add    %eax,(%rsi)
로그인 후 복사

이 예에서 제한으로 최적화된 'fr' 함수는 하나가 적습니다. 최적화되지 않은 'f'보다 어셈블리 명령 function.

배열

Restrict는 배열을 참조하는 포인터 인수를 처리할 때 특히 유용할 수 있으므로 컴파일러가 memset 및 memcpy와 같은 작업을 최적화하여 잠재적으로 성능을 향상시킬 수 있습니다.

배열 예

void f(char *restrict p1, char *restrict p2, size_t size) {
     for (size_t i = 0; i < size; i++) {
         p1[i] = 4;
         p2[i] = 9;
     }
 }
로그인 후 복사

restrict를 사용하면 이 코드는 효율성을 높이기 위해 memset을 사용하도록 최적화될 수 있습니다. 제한을 제거하면 이 최적화가 비활성화되어 배열이 겹치는 경우 잘못된 동작이 발생합니다.

엄격한 별칭 규칙

제한은 엄격한 제한으로 인해 호환 가능한 유형의 포인터에만 적용됩니다. 앨리어싱 규칙. 호환되지 않는 유형을 유효한 유형으로 변환하면 제한 계약이 깨져 잠재적으로 정의되지 않은 동작이 발생할 수 있습니다.

GCC 확장

GCC에서는 제한을 참조 및 멤버 함수를 사용하여 최적화 기능의 범위를 확장합니다.

위 내용은 C `restrict` 키워드의 기능은 무엇이며 코드를 어떻게 최적화합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿