본문 바로가기
Basic/C/C++

[C언어] 제 18 강 : 메모리 관련 함수와 한정자

by boxbop 2012. 1. 26.
반응형


 포인터와 관련이 있는 내용들을 설명하겠습니다. 여기서 한장자라고 하면 제한을 걸때 사용되는 키워드라고 할 수 있습니다.

 포인터의 const 선언
const는 변수를 상수화 하는 용도로 사용이 됩니다. 이번에는 포인터에 적용해보도록 하겠습니다.

 int number =10;
 int* ptr = &number;

 여기서 const가 들어갈 수 있는 자리는 2군데 있습니다.

const int* const ptr = #

포인터 선언 앞에 사용될 수 있고, 포인터 변수의 이름 앞에 삽입될 수도 있습니다. 두 군데 모두 사용할 수도 있습니다.

 int number = 10;
 const int* ptr = &number;

이렇게 사용이 된다면 포인터 ptr은 가리키는 대상에 대한 값의 변경이 허용되지 않습니다. 예를들어 *ptr=20; 이런 문장이 컴파일 에러를 발생키기죠. 즉, 포인터를 이용한 값의 변경을 허용하지 않겠다는 뜻이 됩니다.

 int number = 10;
 int* const ptr = &number;

 이번에는 포인터 변수의 이름 앞에 사용이 되었습니다. 이 선언은 포인터 변수 ptr을 상수화 시킨다는 의미입니다. 즉, 포인터 변수 ptr에 저장된 값의 변경이 불가능 하다는 뜻이 됩니다. 때문에 이러한 선언을 하게되면 포인터 ptr은 끝까지 변수 num만 가리키게 됩니다.

 결론적으로 첫 번째 선언은 ptr이 가리키는 변수에 저장된 값을 변경할 수 없고, 두 번재 선언은 ptr 자체가 number의 주소값으로 상수화 되어 변경할 수 없다는 의미입니다.

 volatile 과 restrict 키워드는 간단하게 넘어가겠습니다.
volatile 키워드는 변수의 선언 앞에 사용됩니다. 해당 변수와 관련해서는 코드 최적화를 수행하면 안된다는 의미입니다. restrict은 그 반대로 최적화를 우도하는 선언입니다. 포인터 선언에서의 restrict 키워드는 이 포인터가 가리키는 메모리 공간은 이 포인터만으로 접근이 가능하다는 것을 의미합니다. 때문에 해당 포인터가 가리키는 메모리 영역의 접근 연산은 캐쉬 메모리를 기반으로 최고의 성능을 낼 수 있도록 코드가 최적화됩니다.

 다음은 메모리 컨트롤 관련 함수입니다.

 memmove : 어떠한 경우에도 사용할 수 있는 메모리 복사 함수
cf) void* memmove(void* dest, const void* src, sizt_t len);
->매개변수 src로 전달된 값을 시작주소로 하여 len바이트를 읽어 들여서, 매개변수 dest로 전달된 주소에 복사를한다.

 memcpy : 제한된 상황에서의 메모리 복사
cf) void* memcpy(void* restrict dest, const void* restrict src, size_t len);
->memmove와 기능상 차이는 없다. 그러나 dest와 src가 restrict으로 선언되었다. 따라서 함수가 호출되면서 dest와 src로 전달된 주소 값의 메모리는 각각 dest와 src로만 접근이 가능해야 한다.(원본대상과 복사본이 겹치는 경우 사용할 수 없다)
반응형