Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C언어에는 volatile 가 있습니다.

653 views
Skip to first unread message

PG

unread,
Apr 19, 2007, 12:17:19 PM4/19/07
to
안녕하십니까? 이제 따듯한 느낌을 가지게 됩니다.

C에서 volatile 가 있습니다.
어디서는 간단하게 최적화를 위해 존재한다고 설명을 하는데

이를 가지고 어떤 역할을 하는지 이해할 수가 없습니다.

도대체 어떤 역할을 하기에 이가 존재하는지 궁금합니다.
간단하게 윈도 어플 작성하게 되면 쓰는 경우를 보지도 못했습니다.

고수님들의 자세한 설명 부탁드립니다.


radmsg...@yahoo.co.kr

unread,
May 8, 2007, 1:17:55 AM5/8/07
to
> C에서 volatile 가 있습니다.
> 어디서는 간단하게 최적화를 위해 존재한다고 설명을 하는데
>
> 이를 가지고 어떤 역할을 하는지 이해할 수가 없습니다.
>
> 도대체 어떤 역할을 하기에 이가 존재하는지 궁금합니다.


C언어 고수는 아니지만, volatile 을 제가 이해하는 방법은 이렇습니다.
volatile 변수의 연산(읽고/쓰기)에 대한 최적화를 하지 못하도록 compiler 에게 알려주는 것으로 이해합니다.

가령, Loop 에서 변수의 값이 변경되었을 때 빠져나오게 하는 구문이 있습니다. 그러나, Loop 내에는 그 변수에 대한 연산
동작이 없습니다.
컴파일러는 Loop 내에 변수에 대한 연산동작이 없으므로, 최초 한번만 변수의 값을 읽고, 이후에는 다시 읽어오지 않게끔 최적
화 할수 있습니다.

여기 까지는 이해 하시는 내용일 것입니다.

하지만, 변수가 다른 함수 (SIGNAL 설정이나, 윈도우즈의 Timer Event 와 같은)혹은 하드웨어에 의한 집적 메모리
조작으로 변경되는 경우에는 최적화를 하면 안되겠죠?

그런 경우에 사용한다고 보시면 될듯 합니다.

volatile int v = 0;
void wait_signal(void)
{
while( v == 0);
}

void TimerEvent(void) // 윈도우즈 함수를 모르니 이렇다고 가정합시다 :) //
{
v = 1;
}


> 간단하게 윈도 어플 작성하게 되면 쓰는 경우를 보지도 못했습니다.

윈도우즈에는 저런 경우를 위해 여러가지 동기화 함수나 변수가 존재합니다. 주로 그것을 이용하는 거라 알고 있습니다.

주제와 무관하게 첨언하자면, 델파이(5) 같은 경우 for 문내의 증감변수를 사용하지 않을 경우, 증가식 구문이라도 최적화
를 통해 감소식 구문처럼 동작합니다.
즉, for(i=0; i<10; i++) 와 같은 식이 for(i=10; i != 0; i--) 같은 식으로 컴파일 됩
니다. 이 것이 비단 델파이만 그럴까요?

crazytazo

unread,
May 16, 2007, 10:57:18 AM5/16/07
to


cpp에서 새로 생긴 키워드 아니었던가요?
기억이 잘 나지 않는군요^^;

volatile 의 사전적 의미는 '휘발성' 일 겁니다.
술을 좀 마셔서 틀릴지도 모릅니다( -_-;

에...
조금 쉽게 설명 해볼께요.

v 라는 변수가 메인 메모리에 로드 되어 있고, 이 변수 v 를 계속 읽어 들여야하는 코드가 있다고 가정해 봅시다.
요즘 컴파일러들은 너무도 똑똑해서 이런 경우에, 실제로 메인 메모리에 가서 v 의 값을 읽어오지 않고
임의의 어떤 정해진 레지스터에 변수 v를 저장해놓고 얍삽하게 레지스터에서 v 의 값을 읽어 옵니다.
메인 메모리에 다녀오지 않기 때문에 속도차이는 엄청나겠지요.

volatile은 이런 얍삽이 최적화를 쓰지 말고, 무조건 main memory에서 진짜! v의 값을 가져오라고 컴파일러에게 명
령하는 것 입니다.

물론 메인 메모리의 v 값이 바뀌어 버린 순간에, 레지스터에 저장된 이전의 값을 가져 올 때에,
프로그램은 오동작하게 될 것입니다.
그런 오동작을 방지 하기 위해서 volatile 이라는 키워드를 사용합니다.

일반적인 프로그래밍 환경에서는 자주 쓰이지는 않고, 임베디드 시스템 프로그래밍이나 멀티 쓰레드 프로그래밍을 작성 할 때에 사용됩
니다.

Message has been deleted
0 new messages