2016-06-29 3 views
0

지금 메신저 저장 용량 클래스 here에 대해 알아 봅니다. 그리고 그는 자동 스토리지 클래스와 레지스터 스토리지 클래스에 대해 똑같은 것을 설명하는 것 같습니다. 그가 두 가지 사이에 분명한 것은 레지스터 저장소 클래스가 CPU 레지스터에 저장된다는 것입니다. 이러한 저장소 클래스간에 차이가 있습니까? 레지스터 스토리지 클래스를 사용합니까? 일부 C 컴파일러에서는 기본적으로 Register 키워드가 등록되어 있습니까?등록 대 자동 스토리지 클래스?

register int x = 5; 
auto int y = 3; 
+1

블록 범위 객체는 기본적으로 '자동'이므로 지정자는 완전히 쓸모가 없습니다. 'register'는 lobotomized 컴파일러에 대해서만 중요합니다. – EOF

+0

왜 lobotomized 컴파일러에서만 중요합니까? 그리고 그것은 심지어 무엇을 의미합니까? @EOF – amanuel2

+1

'gcc','icc' 또는'clang'과 같은 최신 컴파일러를 사용하고 적당한 최적화 설정을 가능하게하면 컴파일러는 주소가없는 객체를 할당합니다 (또는 주소가 함수를 벗어나지 않습니다))를 'register'로 선언했는지 여부에 관계없이 cpu 레지스터에 보관할 수 있습니다. – EOF

답변

4

register 스토리지 클래스 객체가 레지스터에 저장된다는 것을 의미하지는 않는다. 이 표준은 말한다 :

저장소 클래스 지정 register의 객체에 대한 식별자의 선언이 개체에 대한 액세스가 가능한 을 빨리 할 것을 제안. 그러한 제안의 범위는 구현 정의 된 입니다.

것을 수행하는 하나 개의 방법이 아니라 메모리에 비해 CPU 레지스터의 목적이다 저장

(인용은 ISO C 표준의 N1570 초안에서 섹션 6.7.1 단락 6이다) 그러나 유일한 것은 아닙니다.

최신 컴파일러 (보통 일반적인 지혜에 따르면)는 아마도 변수를 레지스터에 저장하여 속도를 결정하는 것보다 낫습니다. 따라서 register 키워드를 사용하면 컴파일러의 작업을 방해하지 않을 것입니다 최적화.

register 또한 메모리에 저장되어 있어도 객체의 주소를 가져 오는 것은 불법입니다.

기본적으로 현대 컴파일러가 수행하는 정교한 최적화 작업을 수행하지 않은 초기 컴파일러 (1970 년대)의 잡동사니입니다. 이러한 컴파일러의 경우에는 성능을 크게 향상시킬 수 있습니다.

(현대 컴파일러는 변수의 주소가 필요하거나 사용할 수있는 레지스터가 충분하지 않기 때문에 모든 변수를 레지스터에 할당 할 수 있다고 가정하고 필요한 경우에만 메모리에 "유출"한다고 생각합니다. .)

+0

첫 번째 .. 우리가 만났습니까? 회의실에있는 사람입니까? 둘째 .. .... 흠, 나는 어딘가에 미안하다는 것을 잊어 버린 마지막 코멘트를 들었다. 귀하의 anwser에 대해 감사드립니다. – amanuel2

+0

@Dsafds : 아니요, 저는 회의실 (해당 내용이 확실하지 않음)에 없습니다. 그리고 당신은 환영합니다. –

+0

빠른 질문 하나 Keith, 왜 우리는 심지어 auto 키워드를 사용합니까? dosent 그것의 기본 jsut? 그리고 미안해, 우리가 만난 줄 알았는데, 아바타는 너와 똑같은데, 비슷하게 생겼어. – amanuel2