source

레지스터 키워드가 생성된 이유는 무엇입니까?

lovecheck 2023. 7. 1. 08:59
반응형

레지스터 키워드가 생성된 이유는 무엇입니까?

Herb Sutter '그렇지 않은 키워드'(또는 '다른 이름의 댓글')를 읽는 동안 저는 다음과 같은 대사를 접했습니다.

맞습니다, 어떤 키워드는 의미론적으로 공백, 미화된 댓글과 같습니다.

그리고.

우리는 왜 C++ 언어가 키워드를 예약된 단어로 취급하는지 보았고, C++ 프로그램에 의미론적인 차이가 없는 두 개의 키워드, 즉 자동 및 등록을 보았습니다.사용하지 마십시오. 공백일 뿐이므로 공백을 더 빠르게 입력할 수 있습니다.

만약 키워드가auto(C++11에서는 아닐 수 있음) 및register가치가 없는데, 왜 그것들이 만들어지고 사용되었습니까?

만약 그것을 포함하는 것이 아무런 차이가 없다면.register변수 앞에

#include<stdio.h>
int main(){
    register int a = 15;
    printf("%d\n%d\n",&a,a);
    return 0;
}

위 프로그램에서 오류가 발생하는 이유는 무엇입니까?

test_register.c: 'main' 함수:

test_register.c:4:2: 오류: 레지스터 변수 'a'의 주소가 요청되었습니다.

printf("%d\n%d\n",&a,a);

다음 프로그램은 C++로 작동합니다.

#include<iostream>
int main(){
    register int a = 15;
    std::cout<<&a<<'\n'<<a;
    return 0;
}

등록하세요

C에서,register변수가 레지스터에 우선적으로 저장되어야 한다는 것을 표현하기 위해 저장소 클래스가 컴파일러에 대한 힌트로 사용되었습니다.저장할 힌트register실제 레지스터의 변수는 허용될 수도 있고 허용되지 않을 수도 있지만, 두 경우 모두 관련 제한 사항이 적용됩니다.C11, 6.7.1p6(광산 강조) 참조:

스토리지 클래스 지정자가 있는 개체에 대한 식별자 선언register개체에 최대한 빨리 액세스할 수 있음을 나타냅니다.이러한 제안이 효과적인 범위는 구현으로 정의됩니다.[그림 121]

[각주 121] 구현은 다음을 처리할 수 있습니다.register단순한 선언.auto선언.그러나 주소 지정 가능한 스토리지가 실제로 사용되는지 여부에 관계없이 스토리지 클래스 지정자로 선언된 개체의 어떤 부분의 주소도 명시적으로(6.5.3.2에서 설명한 단항 연산자 및 연산자 사용) 또는 암시적으로(6.3.2.1에서 설명한 대로 배열 이름을 포인터로 변환하여) 계산할 수 없습니다.따라서 스토리지 클래스 지정자로 선언된 어레이에 적용할 수 있는 유일한 연산자register이다sizeof그리고._Alignof.

C++에서는 단순히 사용되지 않는 예약 키워드이지만, C 코드와의 구문 호환성을 위해 유지되었다고 가정하는 것이 합리적입니다.

자동의

C서에는,auto저장소 클래스는 자동 저장소의 변수를 정의하지만 함수-로컬 변수가 기본적으로 사용되기 때문에 일반적으로 사용되지 않습니다.

마찬가지로, 나중에 고유한 의미(유형 추론)를 얻었지만, 처음에는 구문 호환성만을 위해 C++로 넘어갔다고 가정하는 것이 합리적입니다.

registerC에서 제공되는 두 가지 목적:

  • 컴파일러에 성능을 위해 레지스터에 변수를 저장해야 함을 암시합니다.이 사용법은 현재 거의 쓸모가 없습니다.
  • 프로그래머가 변수를 레지스터에 저장할 수 없는 방식으로 사용하지 못하도록 합니다.이 사용은 일부 구식 IMO에 불과합니다.

은 이는다비슷다니합과와 .const 그렇고요.

  • 컴파일러에 변수가 읽기 전용 메모리에 저장될 수 있음을 암시합니다.
  • 프로그래머가 변수에 쓸 수 없도록 합니다.

예를 들어, 다음과 같은 단순 함수를 고려합니다.

int sum(const int *values, size_t length) {
    register int acc = 0;
    for (size_t i = 0; i < length; ++i) {
        acc += values[i];
    }
    return acc;
}

프로그래머가 작성했습니다.register업데이트할 때마다 메모리 쓰기를 방지하여 축전지를 스택에서 분리할 수 있습니다.구현이 다음과 같은 방식으로 변경되는 경우

// Defined in some other translation unit
void add(int *dest, int src);

int sum(const int *values, size_t length) {
    register int acc = 0;
    for (size_t i = 0; i < length; ++i) {
        add(&acc, values[i]);
    }
    return acc;
}

acc변수의 주소가 다음을 위해 취해질 때 더 이상 레지스터에 저장될 수 없습니다.add()레지스터에 주소가 없기 때문에 호출합니다.따라서 컴파일러는 플래그를 표시합니다.&acc오류로서, 당신이 아마도 당신의 코드의 성능을 파괴했다는 것을 당신에게 알려주는 것.acc등록부에 사는 것으로부터.

이것은 컴파일러가 더 멍청하고 변수들이 전체 함수를 위해 한 곳에 살 때 훨씬 더 중요했습니다.오늘날 변수는 대부분의 수명을 레지스터에서 보낼 수 있으며, 주소를 가져올 때만 일시적으로 스택으로 이동됩니다.즉, 다음 코드:

/* Passed by reference for some reason. */
void debug(const int *value);

int sum(const int *values, size_t length) {
    int acc = 0;
    for (size_t i = 0; i < length; ++i) {
        acc += values[i];
    }
    debug(&acc);
    return acc;
}

유발했을 것입니다.acc오래된 컴파일러에서 전체 함수를 스택에 저장할 수 있습니다.는 최신컴파는유다다니지합음을러일▁keep다를 유지할 입니다.acc그직까등에기부지 에.debug()콜.콜.

의 C 으로 현의대 C 드는으다않사다습니음지용하을로반을 .register키워드

는 키워드 C99의 을 좀 더 제공합니다.register:

국제 표준의 근거 - 프로그래밍 언어 - 프로그래밍 언어 C

◦6.7.1 스토리지 등급 지정자

왜하면주의 register 수 . 클래스 입니다. 스토리지 클래스의 개체입니다.register다른 객체와 구별되는 공간에 효과적으로 존재합니다. (함수는 아직 세 번째 주소 공간을 차지합니다.)따라서 레지스터를 선언하는 일반적인 이유인 최적의 배치 후보가 될 수 있지만 보다 적극적인 최적화 후보가 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/37456494/why-was-the-register-keyword-created

반응형