문제

C에서는 &를 사용하여 레지스터 변수의 주소를 알아낼 수 없지만 C++에서는 &를 사용할 수 있습니다.C++에서는 허용되지만 C에서는 허용되지 않는 이유는 무엇입니까?누군가 이 개념을 자세히 설명해 주실 수 있나요?

도움이 되었습니까?

해결책

다음은 6.7.1 절 (각주 101)의 발췌문입니다. C99 표준 (PDF):

구현은 어떤 것을 취급 할 수 있습니다 register 단순히 선언 auto 선언. 하지만, 주소가 주소 스토리지가 실제로 사용되는지 여부에 관계없이 스토리지 클래스 지정자 레지스터로 선언 된 객체의 일부의 주소는 계산할 수 없습니다., 명시 적으로 (외교를 사용하여 & 6.5.3.2에서 논의 된 연산자 또는 암시 적으로 (6.3.2.1에서 논의 된대로 배열 이름을 포인터로 변환함으로써). 따라서 스토리지 클래스 지정자로 선언 된 배열에 적용 할 수있는 유일한 연산자 register ~이다 sizeof.

그리고 7.1.1 절, 단락 3에서 C ++ 표준 (PDF):

register Specifier는 auto 지정자는 그렇게 선언 한 객체가 크게 사용될 것이라는 구현에 대한 힌트와 함께. 참고 : 힌트는 무시할 수 있으며 대부분의 구현에서는 객체의 주소를 사용하면 무시됩니다. - 엔드 참고

재미있는 음식에 관한 register

C ++ 그룹 (WG21) 감가 상각을 원합니다 register:

그만큼 register 키워드는 기능이 거의 없으며, 메모가 일반적으로 무시된다는 힌트를 제공하지 않습니다. 이 버전의 표준에서 더 이상 사용되지 않아 미래 표준에서 사용하기 위해 예약 이름을 풀어야합니다. auto 이번에는 비슷한 쓸모가 없어서 재사용되었습니다.

2009 년 3 월 회의의 메모 :

CWG의 합의는 감가 상징적 인 것에 찬성했다. register.

C99 그룹 (WG14)을보세요 말했다 register (PDF) 회의에서 :

auto”키워드. WG21을 이전의 사용으로 돌아가도록 요청해야합니까?register”(주소 없음)? 아니요, 이것은 WG21로 날지 않습니다.

다른 팁

레지스터 키워드는 힌트 전용이며 무시할 수 있습니다. 대부분의 C ++ 컴파일러는 항상이를 무시하지만 모든 C ++ 컴파일러는 변수의 주소를 사용하거나 참조를 작성하면이를 무시합니다.

반면에 C ++ 컴파일러는 가지다 변수의 주소를 가져 가기 때문에 "등록"을 무시합니다. 이론적으로 컴파일러는 레지스터에 저장하고 무대 뒤에서 레지스터에 매핑되는 마법의 포인터 값을 줄 수 있지만, 그 이득이 거의 없기 때문에 컴파일러가 거의 없을 것입니다 (내가 아는). 그런 일을합니다.

레지스터는 C에서도 무시할 수 있으므로 레지스터 변수의 주소를 취하는 것에 대한 명시적인 규모는 단순히 C 컴파일러를 확인하는 부담으로부터 완화하는 것이라고 생각합니다.

C ++ 표준의 관련 부분은 7.1.1.3입니다.

레지스터 지정자는 자동 지정자와 동일한 의미를 가지고 있으며, 그렇게 선언 한 객체가 크게 사용될 것이라는 구현에 대한 힌트를 가지고 있습니다. [참고 : 힌트는 무시할 수 있으며 대부분의 구현에서는 객체의 주소를 사용하면 무시됩니다. - 엔드 참고

슈퍼 늦은 답변에 대해 죄송합니다.

문제는 C, register 원래 레지스터에 값을 저장하는 것을 의미하므로 int 그리고 char 그것에 사용될 수 있습니다. 그러나 시간, 특히 표준 C ++가 있으면 "CPU의 등록에서"가 아니라 "빠른 액세스"로 확대되었습니다. 그래서 C ++에서는 배열 일 수 있습니다 register 유형이지만 CPU 레지스터에 배열을 저장할 수는 없다는 것을 알고 있습니다. 따라서 위의 의미에서 C ++ 레지스터를 다루는 것은 논리적으로 괜찮지 만 값이 실제로 CPU 레지스터에있는 경우에도 여전히 의미가 없습니다.

C 호환성이 없었다면 키워드가 언어에 포함되지 않았을 것이라고 가정합니다.어떤 권위자에게도 말할 수는 없지만 만약 그렇다면 단순히 표준에 따라 시행되는 "컴파일러는 당신보다 똑똑합니다"라는 조항을 넘어 합법적이어야 하는 실질적인 이유가 있는 것 같습니다.C++는 C보다 더 쉽게 허가 없이 주소를 가져옵니다.구체적으로:멤버 함수 및 참조.

멤버 함수에는 암시적 this 매개변수가 선언된 객체에서 호출하는 것은 불가능합니다. register.C에서는 당신이 말하는 것을 금지하는 것이 없습니다 register struct X x;, 따라서 이러한 언어는 C++에서 허용되어야 합니다(C 호환성이 키워드가 존재하는 전체 이유이므로).그러나 멤버 함수 호출과 주소 가져오기를 금지하는 경우 초기 생성자 호출도 포함됩니다.본질적으로 POD가 아닌 유형에서는 작동하지 않습니다.따라서 합법적인 유형의 작은 하위 집합에만 유효한 하나의 저장소 클래스 지정자가 생기고 나머지는 모두 무엇이든 사용할 수 있습니다.

기술적으로 컴파일러가 참조를 포인터로 처리할 필요가 없더라도 이러한 개체에 대한 참조를 만들 수도 없습니다. register int i; int& x; 두 변수를 위한 공간이 필요하지 않지만 나중에 그렇게 하면 &x 당신은 포인터로 끝납니다 i.따라서 초기 구성은 불법으로 간주되어야 합니다.이것이 문제가 아닌 것처럼 보이지만 어쨌든 C에는 참조가 존재하지 않기 때문에 이전 요점으로 돌아가서 POD 유형은 register 지정자를 더 이상 복사할 수 없습니다.컴파일러가 제공하는 복사 생성자는 다음과 같은 형식입니다. X::X(const X&) 또는 X::X(X&) 적절한.

따라서 C 호환성을 유지하려면 다음을 작성해야 합니다. register 모든 유형에 적용되지 않는다는 점에서 저장소 클래스 지정자로서 고유하며 다른 곳에서 표준의 두 개 이상의 다른 부분을 수정합니다. [ register 지정자를 사용하고 POD 복사에 대한 참조를 어떻게든 해결합니다.]또는 "주소를 가져와도 괜찮습니다"라고 말하고 컴파일러가 요청을 받아들일지 여부를 결정하도록 할 수도 있습니다.어쨌든 그들은 뭔가를 하려고 계획하고 있었습니다.

레지스터 변수에는 주소가 없으며 CPU 레지스터에서 보유됩니다 (적어도 개최되어야 함). 레지스터 수정자는 힌트 일 뿐이므로 컴파일러가 주소를 추출하도록 코드를 생성하도록 강요하면 수정자가 무시되고 메모리에 보유 된 일반 변수가 끝납니다.

귀하의 질문에 직접 답변하려면 레지스터 변수의 주소를 취할 수있는 질문 (원래 게시물 자체가 모순됩니다.)을 사용하면 자신의 힌트를 무시하고 최소한 경고를 발행해야합니다. IMO 올바른 구현은 레지스터 변수의 주소를 취하지 않는 것입니다.

기억해야 할 중요한 점은 "등록"은 컴파일러에 대한 힌트 일 뿐이라는 것입니다 (무의미한 것, 나는 속도 개선을 본 적이 없으며 대부분의 컴파일러는 아마 그것을 무시할 것입니다). C와 C ++는 "조언"을 무시하고 변수를 메모리에 유지할 수 있습니다. 물론 변수의 주소를 사용하면 메모리에 스팟을 할당하도록합니다.

C와 C ++는 언어가 다른 것에 대해 할 수있는 일에 대해 다른 규칙을 가지고 있습니다. C ++ 디자이너는 아무 것도 해치지 않기 때문에 레지스터 변수의 주소를 얻을 수 있도록 결정했습니다. C는 메모리를 강제하기 때문에 그렇게 할 수 없습니다.

더 생각하면 C의 제한은 아마도 블록의 시작 부분에서 변수를 선언 해야하는 것과 같은 이유 일 것입니다. 컴파일러는 나중에 기능에서 사용되는 방식에 관계없이 변수에 대한 메모리에 대한 메모리를 레이아웃 할 수 있습니다.

이것은 교육받은 추측 일 뿐이지 만, 그러한 생각은 단순히 존재하지 않기 때문에 C ++의 레지스터 주소를 취할 수 있다고 의심합니다. C ++는 아마도 특정 사례에서 레지스터를 사용하지 않을 것입니다. 스토리지 클래스 예선에 주목하십시오 register 컴파일러에 대한 힌트 일뿐입니다 (대부분의 현대 컴파일러가 행복하게 완전히 무시하는 것은 아닙니다).

C와 C ++는 큰 공통 서브 세트가있는 두 가지 언어입니다. 그렇기 때문에 일부는 그들 사이에 다른 것들이 있습니다.

당신의 질문을 이해하지 못하는 동안 register (적어도 C ++에서) 변수가 더 자주 액세스 될 수 있고 더 이상 아무것도 액세스 할 수 있다는 힌트입니다. C에서는 주소를 & 당시에는 어느 정도 의미가있었습니다. C의 초기에는 컴파일러가 변수에 대한 메모리 할당을 방해하지 않을 것으로 예상되었으므로 반드시 주소가 없을 필요는 없습니다.

(컴퓨터는 일반적으로 CPU의 빠른 액세스 부분 인 레지스터가 있으며, 따라서 액세스하기에 가장 빠른 스토리지가 있습니다. 변수는 더 나은 성능을 일으킨 경우 메모리가 아닌 레지스터에 살 수 있습니다.)

요즘 거의 모든 컴파일러는 프로그래머가 할 수있는 것보다 자체 할당을 더 잘 수행 할 수있을 정도로 정교합니다. register 거의 항상 무의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top