달력

12

« 2024/12 »

  • 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
2010. 10. 19. 20:20

한정자(Type Qualifiers) JAVA이야기2010. 10. 19. 20:20

한정자는 한정과 자의 조합이다. 한정은 제한의 의미를 가진다. 즉, 한정자는 제한을 걸 때에 사용되는 키워드이다. 
C에서 제공하는 한정자는 아래와 같다
const
volatile
restrict

int *prt = #
포인터 ptr 선언에서 const가 들어갈 수 있는 위치는 다음과 같다
const int * const ptrt = #

포인터 선언 앞 부분에 const가 삽입될 수도 있고, 포인터 변수의 이름 앞에const가 삽입될 수 도 있다. 이 둘은 다른 의미를 가진다.

1)const int *ptr = &num
이렇게 선언되면 포인터 ptr은 값의 참조만 가능할 뿐 변경은 불가능하다 예) (*ptr)++; 불가능
즉, 앞의 const는 가리키는 대상의 객체를 변경불가.

2) int * const ptr =  &num
포인터 변수 ptr을 상수화 시킨다는 의미이다. 즉 포인터 변수 ptr에 저장된 값의 변경이 불가능해지는 것이다. 예) (*ptr)++; 가능
즉, 뒤의 const는 가리키는 대상의 객체는 변경가능하나, 다른 객체를 참조할 수 없다.

3) 앞뒤로 다 쓰면
객체를 접근할 수도 없고, 다른 객체를 가르킬 수 도 없다.

int * const ptr = #
int * const ptr;  //선언과 동시에 쓸모없어짐.. 왜냐하면 NULL으로 초기화되엇으므로, 

Volatile : 최적화를 수행하지 말라

volatile int num;
volatile int *ptr;

"변수 num에 저장된 값은 순간적으로 다른 영역으로 참조될 수 있어, 그러니깐 코드 최적화를 수행하면 안대"

AAA(10)
num+=10;
BBB(20)
num+=20;
CCC(30)
num+=30;

컴파일러는 이 문장을 보고 "num은 어디에도 참조되지 않으니깐 num += 60해도 되겟군" 이라고 생각한다
하지만 volatile int num으로 선언하면 num은 코드 최적화를 수행하지 않는다

참고로 , 이렇게 선언된 volatile로 선언된 변수 값의 변경은 항상 메인메모리에 올라감 

restrict :원하는 대로 맘껏 최적화를 수행하세여

int * restrict ptr;
"이 포인터가 가리키는 메모리 공간은 이 포인터만으로 접근이 가능한 영역이다"
포인터 ptr을 이용해서 접근 가능한 메모리 공간은 num이라는 변수 이름으로도 접근이 가능하기 때문이다. 
반면 다음과 같은 ptr은 적절하다 왜냐하면 malloc함수를 통해서 할당된 메모리 공간은 포인터 ptr을 통해서만 접근이 가능하기 때문이다.

int main(){
int *restrict ptr = (int *)malloc(sizeof(int));
}

#include<string.h>
void *memmove(void *dest, const void *src, size_t len)
매개변수 dest로 전달된 주소값이 그대로 반환된다.
매개변수 src로 전달된 값을 시작주소로 하여 len 바이트를 읽어 , 매개변수 dest로 전달된 주소에 복사한다

'JAVA이야기' 카테고리의 다른 글

"[취업뽀개기]삼성,LG,두산,한화,SK,STX,현대 대기업 취업족보  (0) 2011.06.20
캔버스 무료 경품 추첨  (0) 2011.03.28
Volatile 과 restrict  (0) 2010.09.02
Thread - 대기와 통지  (0) 2010.08.10
Java Inner Class  (0) 2010.08.10
:
Posted by НooпeУ


Code Start Code End