// 함수내에서 아래와 같이 선언함.
volatile unsigned int var1;
volatile register unsigned int val2;
volatile auto unsigned int val3;
위 선언에 있어 volatile의 역할은 정확히 무엇입니까?
var2의 경우 컴파일러는 함수내에서 var2는 반드시 레지스터를 사용해야 되는게
아닌가요?
지역변수로 레지스터 또는 스택을 사용하는 컴파일러에서 val3의 선언이 val2의
선언과 다른 점은 무엇인지요?
암튼,,, volatile의 정확한 의미가 궁금합니다.
고수님들 도움 좀 주십시오.
그리고, register키워드를 썼다고해서 꼭 register를
사용한다는 보장은
없습니다.
레지스터가 여유가 있으면 레지스터가 우선 할당될
뿐입니다.
컴파일러가 함수 안에서 지역변수로 사용할 수 있는 레지스터가 2개 있고
나머지는 스텍을 사용한다고 가정해 봅시다.
그럼 아래 선언에서 컴파일러는 각각의 변수들을 어떻게 할당할까요?
volatile unsigned int val1;
volatile register unsigned int val2;
unsigned int val3;
unsigned int val4;
unsigned int val5;
우선 val1은 스텍을 사용할 것입니다. 맞나요?
그럼 나머지 4개의 변수들중 2개의 레지스터를 사용하는 변수는 무엇입니까?
님의 말씀대로라면 val2가 레지스터를 사용할 수도 있고 그렇지 않을 수도 있다는
건가요?
volatile의 역할이 컴파일러에게 "임의로 최적화를 하지 말라"라는 지시는 하는
것이라면 val2역시 레지스터를 사용해야 하는 것 아닌지요?
만약 아니라면 register의 역할이 "될수 있으면 레지스터를 사용해라" 라는 의미
인가요?
"반드시 레지스터를 사용해라" 라는 의미가 아닌거네요?
그럼 register키워드는 아무런 의미가 없는거네요?
또한,
혹시 val2의 선언이 의미 없는 선언은 아닌지요?
volatile의 정의가 "최적화를 하지마라" 라는 것이라면,
컴파일러는 최적화를 하지 않는 범위내에서 컴파일러가 알아서 컴파일 하면 되는
건가요?
즉, 표준은 "최적화를 하지마라"라는 것만 정의해 놓고,
컴파일러는 최적화를 하지 않게 끔 컴파일 하는 것인지요?
volatile의 표준 정의가 궁금합니다...ㅜ.ㅜ
"버그소년" <un...@hitel.net> wrote in message
news:1123130685....@g43g2000cwa.googlegroups.com...
Optiahn 작성:
> // 함수내에서 아래와 같이 선언함.
> volatile unsigned int var1;
> volatile register unsigned int val2;
> volatile auto unsigned int val3;
>
> 위 선언에 있어 volatile의 역할은 정확히 무엇입니까?
아래의 내용을 이해하기 위해서는 abstract machine,
side-effect와 sequence point라는 단어의 뜻을 이해하고
있어야 합니다만 여기서 설명하기는 긴 내용이므로
생략하겠습니다.
C99 6.7.3 Type qualifiers
6. An object that has volatile-qualified type may be modified in ways
unknown to the implementation or have other unknown side effects.
Therefore any expression referring to such an object shall be evaluated
strictly according to the rules of the abstract machine, as described
in 5.1.2.3. Furthermore, at every sequence point the value last stored
in the object shall agree with that prescribed by the abstract machine,
except as modified by the unknown factors mentioned previously.114)
What constitutes an access to an object that has volatile-qualified
type is implementation-defined.
해석 : volatile 인 데이터형의 객체는 구현체에
알려지지 않은 방법이나 또는 다른 알려지지 않은
부수효과(side-effect)에 의해 변경될 수 있다. 따라서 이
객체를 참조하는 어떤 수식이라도 그 수식의
추상적인 뜻(C99 5.1.2.3 참조)에 의해 엄밀하게
평가되어야만 한다. 더군다나, 모든 시퀸스
포인트(sequence point)에서 객체에 마지막으로 저장된
값은, 알려지지 않은 요인에 의해 변경된 경우를
제외하고는 그 추상적인 의미에 정확히 일치하는
값이어야 한다. volatile인 객체를 어떻게 다룰것지는
구현체가 정한다.
설명 : volatile 이 붙은 객체는 하드웨어나 혹은 기타
컴파일러가 알지 못하는 원인에 의해 그 내용이
변경될 수 있습니다. (예를 들자면 memory-mapped
input/output address 와 같은 경우) 그렇기에 volatile 인
객체를 다루는 수식(expression)은 최적화를 배제한 체
그 추상적인 의미에 의해 엄밀하게 동작이
이루어져야만 합니다. 또한 모든 sequence point에서
volatile인 객체는 추상적인 의미의 동작에 따른
결과값을 제대로 갖고 있어야 합니다. 즉, 최적화를
위해 동작의 순서를 바꾸거나 미루는 등의 행위를
허용하지 않습니다. volatile인 객체를 어떻게 다루어야
하는지는 C 언어 구현자(e.g.컴파일러 제작업체)가
정하며, 그 사항을 사용자에게 (메뉴얼 등의
방법으로) 알려줄 의무가 있습니다.
114) A volatile declaration may be used to describe an object
corresponding to a memory-mapped input/output port or an object
accessed by an asynchronously interrupting function. Actions on objects
so declared shall not be "optimized out" by an implementation or
reordered except as permitted by the rules for evaluating expressions.
해석 : volatile 은 memory-mapped된 입출력 포트 혹은
비동기적으로 인터럽트되는 함수에 의해 접근되는
객체를 나타내는데 주로 사용된다. 이 객체를
다룰때는 수식 평가 방법에 의해 허용된 경우를
제외하고는, 최적화를 하거나 동작의 순서를
뒤바꾸는 것이 허용되지 않는다.
> var2의 경우 컴파일러는 함수내에서 var2는 반드시 레지스터를 사용해야 되는게
> 아닌가요?
register는 storage-class-specifier에 속하고 volatile는
type-qualifier에 속합니다. 따라서 양립 가능합니다.
storage-class-specifier: typedef extern static auto register
type-qualifier: const restrict volatile
C99 6.7.1 Storage-class specifiers
4. A declaration of an identifier for an object with storage-class
specifier register suggests that access to the object be as fast as
possible. The extent to which such suggestions are effective is
implementation-defined.
register의 엄밀한 뜻은 단지 그 객체에 가능한 한 가장
빠른 방법으로 접근하라는 권고 입니다. 반드시
레지스터상에 위치할 필요도 없고, 반드시 더 빠른
방법일 필요도 없습니다.
register에 대해 몇가지 더 적자면, register가 붙은
객체에 대해서는 & 연산을 사용하는 것이
불가능합니다. 또한 배열에는 register를 붙일 수
없습니다. 이 키워드에 register라는 이름이 붙은 것은
아마도 역사적인 이유 때문이겠지요.
> 지역변수로 레지스터 또는 스택을 사용하는 컴파일러에서 val3의 선언이 val2의
> 선언과 다른 점은 무엇인지요?
val2에는 register가 붙었으므로 컴파일러는 val2에
가능한 한 더 빠르게 접근할 수 있도록 최대한 배려할
것입니다. 방법이 없을 경우에는 그냥 똑같이
취급하겠지만요.
> 암튼,,, volatile의 정확한 의미가 궁금합니다.
> 고수님들 도움 좀 주십시오.
3줄요약:
1 'volatile이 붙은 객체는 컴파일러가 알지 못하는
방법에 의해 수시로 그 값이
2 변경될 수 있으므로, 이 객체를 다룰 때에는
최적화를 하지 말고 최대한 조심하도록
3 컴파일러에게 경고한다' 정도로 알아두시면
되겠습니다.