markdown const,volatile

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown const,volatile相关的知识,希望对你有一定的参考价值。

# const, volatile
## const

- 전역 const 정의는 static 제한자가 사용된 것처럼 취급함.

```c++
const int fingers = 10;     // static const int fingers; 와 같음
int main()
{...}
```
- 상수를 외부 링크로 만들어야 한다면 extern 키워드를 사용함, 이 상수를 사용하는 모든 파일에서 extern 키워드를 사용해야 함

```c++
extern const states = 40; // 외부링크
```

## volatile
- C/C++ 프로그래밍 언어에서 이 키워드는 최적화 등 컴파일러의 재량을 제한하는 역할을 한다. 개발자가 설정한 개념을 구현하기 위해 코딩된 프로그램을 온전히 컴파일되도록 한다. 주로 최적화와 관련하여 volatile가 선언된 변수는 최적화에서 제외된다. OS와 연관되어 장치제어를 위한 주소체계에서 지정한 주소를 직접 액세스하는 방식을 지정할 수도 있다. 리눅스 커널 등의 OS에서 메모리 주소는 MMU와 연관 된 주소체계로 논리주소와 물리주소 간의 변환이 이루어진다. 경우에 따라 이런 변환을 제거하는 역할을 한다. 또한 원거리 메모리 점프 기계어 코드 등의 제한을 푼다.
- 주로 메모리 맵 입출력(MMIO)을 제어할 때, volatile을 선언한 변수를 사용하여 컴파일러의 최적화를 못하게 하는 역할을 한다.

```c++
static int foo;
 
void bar(void)
{
    foo = 0;
 
    while (foo != 255);
}
```
위 코드의 foo의 값의 초기값이 0 이후, while 루프 안에서 foo의 값이 변하지 않기 때문에 while의 조건은 항상 true가 나온다. 따라서 컴파일러는 다음과 같이 최적화한다.

```c++
void bar_optimized(void)
{
    foo = 0;
    while (true);
}
```
이렇게 되면 while의 무한 루프에 빠지게 된다. 이런 최적화를 방지하기 위해 다음과 같이 volatile을 사용한다.

```c++
static volatile int foo;
void bar (void)
{
    foo = 0;
    while (foo != 255);
}
```

이렇게 되면 개발자가 의도한 대로, 그리고 눈에 보이는 대로 기계어 코드가 생성된다. 
이 프로그램만으로는 무한루프라고 생각할 수 있지만, 만약 foo가 하드웨어 장치의 레지스터라면 
하드웨어에 의해 값이 변할 수 있다. 따라서 하드웨어 값을 폴링(polling)할 때 사용할 수 있다.

以上是关于markdown const,volatile的主要内容,如果未能解决你的问题,请参考以下文章

volatile与const综合分析

const和volatile

const 和 const volatile 的区别

您可以从`volatile const char *`构造一个字符串吗? (不使用`const_cast`)

C之 const 和 volatile

volatile 如何与 const 一起工作?