티스토리 뷰

안녕하세요, IT디자이너입니다. 

 

이번에 포스팅할 내용은 C언어의 기억클래스와 속성 수식자 관련하여 포스팅하도록 하겠습니다.

 

기억클래스와 속성수식자란?

 

우리가 변수를 선언할 때 아래 방식처럼 static이나 auto등을 간혹 사용하는 경우와 상수로서 선언할 경우 const 예약어를 사용하는 경우도 있을 것입니다. 

 

기억클래스  -   속성 수식자 -  부호  -  크기 수식자 - 식별자

     auto              const       signed         short        num1

 

여기서 기억클래스와 속성 수식자에 관하여 상세하게 파헤쳐보도록 하겠습니다.

 

- 기억 클래스

1. auto (자동변수)

 

  • 일반적인 지역 변수 형태이며, 블럭 안에서만 유효하며 블럭의 실행이 끝나면 소멸합니다.
  • 스택에 메모리 할당됩니다.
  • 일반적으로 C에서 auto 키워드는 생략되어 있다. 아무 표시도 하지 않은 변수는 자동으로 auto와 같은 의미합니다.

 

2.  static (정적변수)

  • static 변수는 스택영역이 아닌 데이터 영역에 할당되어 프로그램이 끝날 때까지 유지됩니다.
  • static으로 선언된 지역변수는 함수가 종료되거나 블록을 벗어나도 지정된 값을 유지한다.
  • 지역변수 static으로 선언될 경우 해당 블럭 안에서만 호출이 가능합니다.
  • 전역변수를 static으로 선언할 경우 extern을 사용하더라도 외부 파일에서의 접근이 불가능합니다.

 

3. extern (외부변수)

  • extern 으로 선언된 변수는 외부파일에서 동일한 식별자를 참조합니다.
  • static과 동일하게 프로그램 시작시 데이터 영역에 할당되어 프로그램 종료까지 데이터가 유지됩니다.

 

 

 

4. register (레지스터 변수)

  • CPU 내의 레지스터 메모리에 저장되도록 요청을합니다. (컴파일러가 판단하여 레지스터 메모리에 저장하며 보통은 거의 해당 요청을 컴파일러가 무시합니다.)
  • 자동변수와 동일한 속성을 가지고 있으며, 전역변수로는 사용이 불가능하빈다.

 

 

- 속성 수식자

1. const 

  • 상수를 선언할 때 사용하는 예약어입니다. 

하지만 const는 포인터와 사용할 때 주로 헷갈리는 경우가 많습니다. 

 

int num1 = 10;

int num2 = 20;

//첫번째
const int *ptr1 = &num1;

//두번째
int const *ptr2 = &num1;

//세번째
int* const ptr3 = &num1;

 

여기서 ptr1과 ptr2는 동일하게 가리키는 값이 상수로서 "상수에 대한 포인터" ptr1 = &num2;은 가능하지만, 

*ptr1 = 30; 은 불가능합니다.

 

ptr3 는 "상수 포인터"로서 가리키는 값의 변경 즉, ptr3 = 30; 은 가능하지만 ptr3 = &num2; 의 코드는 불가능합니다.

 

 

2. volatile 

 

volatile은 논란이 많은 속성 수식자입니다. 대부분의 사람들이 volatile을 선언한 변수를 레지스터에서 가져오는 것을 막는 즉, 캐쉬를 막는 것이라고 알고있습니다.!!!!!!!! 하지만 이것은 100% 완전히 틀린 내용입니다.!!!!!!!!!!

 

volatile은 레지스터에서 값을 읽어오는 것을 막지 않고 단순히 컴파일러의 최적화를 막는 속성 수식자입니다. 

 

만약 레지스터에서 읽어오는 것을 막고 메모리에서 부터 접근하는 것은 CPU의 아키텍쳐를 완전히 바꿔버리는 것입니다.!! 절대로 혼동하지말아주세요~!!!

 

자, 이제 volatile에 대해 설명드리도록 하겠습니다. 단순히 컴파일러의 최적화를 막는 코드입니다. 

 

위 사진은 최적화를 volatile을 속성 수식자를 사용하여 최적화를 막은 코드입니다. 

 

오른쪽 어셈블리어를 확인해보면 한줄 한줄 코드가 해석되어 어셈블리어 코드로 변환된 모습입니다. 

 

위 사진은 최적화를 한 코드이며, 컴파일러가 판단하여 몇몇 코드를 생략하여 하나의 어셈블리어로 해석하여 최적화 컴파일을 진행한 모습입니다. 

 

예를들어 1~5 까지 값을 더하는 과정을 생략하여 바로 15을 더하는 것이라고 생각하시면 됩니다. 

 

주로 아두이노와 같은 하드웨어를 다루는 프로그래머가 volatile을 주로 사용합니다. 

 


이상 기억클래스와 속성지정자에 관하여 포스팅을 마치도록하겠습니다. 

 

감사합니다. !!! 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함