레지스터 키워드가 생성된 이유는 무엇입니까?
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++로 넘어갔다고 가정하는 것이 합리적입니다.
register
C에서 제공되는 두 가지 목적:
- 컴파일러에 성능을 위해 레지스터에 변수를 저장해야 함을 암시합니다.이 사용법은 현재 거의 쓸모가 없습니다.
- 프로그래머가 변수를 레지스터에 저장할 수 없는 방식으로 사용하지 못하도록 합니다.이 사용은 일부 구식 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
'source' 카테고리의 다른 글
Python 프로젝트에서 단일 실행 파일 생성 (0) | 2023.07.01 |
---|---|
JDBC 연결에 대한 네트워크 시간 초과 설정 (0) | 2023.07.01 |
속성 '내부'텍스트'가 '요소' 유형에 없습니다. (0) | 2023.07.01 |
쿼리 매개 변수를 @ModelAttribute에 매핑하면 @JsonProperty 이름이 존중되지 않습니다. (0) | 2023.07.01 |
Spring REST, JSON "관리/백 참조 'defaultReference'를 처리할 수 없음" 415 지원되지 않는 미디어 유형 (0) | 2023.07.01 |