[c] C에서“등록”키워드?

무엇을 않는 registerC 언어에서 할 키워드? 최적화에 사용되었지만 표준에 명확하게 정의되어 있지 않다는 것을 읽었습니다. 여전히 관련이 있습니까? 그렇다면 언제 사용 하시겠습니까?



답변

컴파일러에 변수가 많이 사용되며 가능한 경우 프로세서 레지스터에 보관할 것을 권장합니다.

대부분의 최신 컴파일러는 자동으로 수행하므로 인간보다 컴파일러를 선택하는 것이 좋습니다.


답변

컴파일러가 레지스터가 아닌 메모리에 변수를 유지하기로 결정하더라도 레지스터 변수의 주소를 사용할 수 없다고 언급 한 사람이 아무도 없습니다.

따라서 register당신을 사용 하면 아무것도 얻지 못하고 (어쨌든 컴파일러는 변수를 넣을 위치를 스스로 결정할 것입니다) &연산자를 잃을 이유가 없습니다.


답변

컴파일러는 변수를 저장하기 위해 RAM 대신 CPU 레지스터를 사용하도록 컴파일러에 지시합니다. 레지스터는 CPU에 있으며 RAM보다 액세스 속도가 훨씬 빠릅니다. 그러나 이것은 컴파일러에 대한 제안 일뿐이며 따르지 않을 수도 있습니다.


답변

나는이 질문이 C에 관한 것이라는 것을 알고 있지만 C ++에 대한 동일한 질문 이이 질문의 정확한 복제본으로 닫혔습니다. 따라서이 답변은 C에는 적용되지 않을 수 있습니다.


C ++ 11 표준의 최신 초안 인 N3485 는 이것을 7.1.1 / 3에서 말합니다

register지정 이렇게 선언 된 변수가 많이 사용됩니다한다는 것을 알 수 있습니다. [ note : 힌트는 무시할 수 있으며 대부분의 구현에서 변수의 주소를 가져 오면 무시됩니다. 이 사용은 더 이상 사용되지 않습니다 … — 끝 참고 ]

C ++에서 (하지만 하지 C에서), 표준하지 않습니다 상태는 변수의 주소를 취할 수 없음을 선언 register; 그러나 수명 동안 CPU 레지스터에 저장된 변수에는 연관된 메모리 위치가 없으므로 해당 주소를 가져 오려고 시도하면 유효하지 않으며 컴파일러는 register키워드를 무시 하여 주소를 가져옵니다.


답변

옵티마이 저가 이보다 더 나은 결정을 내릴 때 15 년 이상 관련이 없었습니다. 관련성이 있었더라도 SPARC 또는 M68000과 같은 레지스터가 많은 CPU 아키텍처에서는 레지스터가 부족한 인텔보다 많은 레지스터를 사용했으며, 대부분 자체 컴파일러가 자체 목적으로 예약했습니다.


답변

실제로 register는 컴파일러에게 변수가 프로그램의 다른 어떤 것과도 별명을 가지지 않는다는 것을 알려줍니다 (char조차 포함하지 않음).

그것은 다양한 상황에서 현대의 컴파일러에 의해 이용 될 수 있으며 복잡한 코드에서 컴파일러를 상당히 도울 수 있습니다. 간단한 코드에서는 컴파일러가 스스로 알아낼 수 있습니다.

그렇지 않으면 목적이 없으며 레지스터 할당에 사용되지 않습니다. 컴파일러가 최신 버전 인 한 일반적으로 성능을 저하시키지 않습니다.


답변

최적화에 사용되었지만 표준에 명확하게 정의되어 있지 않다는 것을 읽었습니다.

사실 그것은 된다 명확하게 C 표준에 의해 정의. N1570 초안 섹션 6.7.1 단락 6 인용 (다른 버전은 동일한 문구가 있음) :

스토리지 클래스 지정자가있는 오브젝트의 식별자 선언은 오브젝트에 register대한 액세스가 가능한 한 빠르다는 것을 나타냅니다. 이러한 제안이 효과적인 범위는 구현에 따라 다릅니다.

단항 &연산자는로 정의 된 객체에 적용되지 않을 수 registerregister외부 선언에서 사용될 수 없다.

register정규화 된 개체에 고유 한 다른 몇 가지 (정확하게 모호한) 규칙이 있습니다.

  • 배열 객체를 정의하면 register동작이 정의되지 않습니다.
    수정 : 으로 배열 객체를 정의하는 것은 합법적 register이지만 그러한 객체로 유용한 것을 수행 할 수는 없습니다 (배열에 색인을 생성하려면 초기 요소의 주소를 사용해야합니다).
  • _Alignas(C11 신규) 지시자는 그러한 객체에 적용 할 수 없다.
  • va_start매크로에 전달 된 매개 변수 이름 이 register-qualified이면 동작이 정의되지 않습니다.

다른 몇 가지가있을 수 있습니다. 표준 초안을 다운로드하고 관심이 있다면 “등록”을 검색하십시오.

이름에서 알 수 있듯이 원래 의미 register는 객체를 CPU 레지스터에 저장해야 한다는 것입니다 . 그러나 컴파일러 최적화가 개선되면서 유용성이 떨어졌습니다. C 표준의 최신 버전은 CPU 레지스터를 더 이상 참조하지 않습니다. 더 이상 필요하지 않다고 가정하기 때문입니다 (레지스터를 사용하지 않는 아키텍처가 있음). 일반적 register으로 객체 선언에 적용 하면 생성 된 코드가 컴파일러의 레지스터 할당을 방해하기 때문에 생성 된 코드 가 더 나빠질 수 있습니다 . 여전히 유용한 몇 가지 경우가있을 수 있습니다 (예 : 변수에 액세스하는 빈도를 실제로 알고 있고 최신 최적화 컴파일러가 알아낼 수있는 것보다 지식이 더 나은 경우).

주요 유형의 효과 register는 객체의 주소를 가져 오려는 시도를 방지한다는 것입니다. 이것은 로컬 변수에만 적용될 수 있고 최적화 컴파일러는 이러한 객체의 주소가 취해지지 않았 음을 스스로 확인할 수 있기 때문에 최적화 힌트로 특히 유용하지 않습니다.