달력

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. 9. 2. 21:45

Volatile 과 restrict JAVA이야기2010. 9. 2. 21:45

volatile로 선언된 변수 값의 변경은 항상 메인 메모리에 반영이 된다. volatile선언이 없는 변수는 성능의 향상을 위해서 값의 변경이 캐쉬 메모리(또는 레지스터)에만 반영되었다가, 뒤늦게 메인 메모리에 반영되기도 한다. 그리고 volatile로 선언된 변수의 값은 참조될 떄에도 캐쉬가 아닌 메인 메모리부터 참조가 이뤄지다. 정리하면 volatile로 선언된 변수는 캐쉬 메모리를 거치지 않는다. 다른 영역으로부터 언제 어떠한 형태로 값의 참조가 이러질지 모르기 때문에 값의 변경이 실시간으로 메인 메모리에 반영된다.

int function(){
int *ptr;
ptr = &num1;
ptr = &num2;
*ptr = 10;
*ptr = 20;
return *ptr;
}

컴파일러 최적화
int function(void){
int *ptr;
ptr = &num2;
*ptr = 20;
return *ptr;
}

여기서 ptr이 volatile로 선언되면 다음과 같은 형태로 최적화 된다. ptr이 가리키는 메모리 공간의 접근에 대한 최적화가 수행되면 안되기 때문에 *연산에 대해서는 최적화가 수행되지 않는다.

int function(void){
volatile int * ptr;
ptr = &num2;
*ptr = 10;
*ptr = 20;
return *ptr;
}

//비트 마스크..
int main()
{
   unsigned short data= 0x5678;
   unsigned short msk1 = 0xf000;
   unsigned short msk2 = 0x0f00;
   unsigned short msk3 = 0x00f0;
   unsigned short msk4 = 0x000f;

   printf("result1 = %#.4x\n ", data & msk1); //0x5000
   printf("result2 = %#.4x\n",data & msk2);   //0x0600
   printf("result2 = %#.4x\n",data & msk3);   //0x0070
   printf("result2 = %#.4x\n",data & msk4);   //0x0008

   return 0;
}

memmove : 어떠한 경우에도 사용할 수 있는 메모리 복사 함수.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void AddProc(void);
void MinusOric(void);
void CallFunc(void (*fctPtr)(void));

int main()
{

    int i;
    int src1[5] = {1,2,3,4,5};
    int dest1[5];

    double src2[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
    double dest2[5];

    memmove((void *)dest1, (void *)src1, sizeof(src1));
    memmove((void *)dest2, (void *)src2, sizeof(src2));

    for(i=0; i < 5; i++){
        printf("%2d %8.2f \n", dest1[i], dest2[i]);
    }

    CallFunc(AddProc);
    CallFunc(MinusOric);

    return 0;
}

//함수 포인터 fctPtr가 이제 AddProc , MinusOric가 되는거임
void CallFunc(void (*fctPtr)(void)){

    fctPtr();
}

void AddProc(void){

    int n1, n2;
    printf("덧셈 위한 2개의 정수 입력 ㅣ: ");
    scanf("%d%d",&n1, &n2);
    printf("%d",n1+n2);
    }

void MinusOric(){

    int n1, n2;

    printf("뺄셈 위한 2개의 정수 입력 : ");
    scanf("%d%d",&n1, &n2);
    printf("%d",n1-n2);
}

//함수포인터 문법생소하넹.
int GoodStruct(void){
return 0;
} <- 이거 가르킬 함수 포인터 정의 int (*fctPtr)(void);
fctPtr이라는 변수를 제거하면
int (*) (void);만 남는다
int (*RctFunc(void))(void)
{
return GoodStruct;
}
RctFunc(void)에서 void는 일반 함수처름 인자를 뜻함 아무 자료형이나 넣어도 됨 쫄지말고(처음에 쫄앗음)
예를들어
RctFunc(int a)로 하면 정의할 떄
void (*RetFunc(int a))(void){
if(a == 1)
return GoodStruct1;
else if(a==2)
return GoodStruct2;
}

해서 써먹으면 끝.. 이제 집에 가자!

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

캔버스 무료 경품 추첨  (0) 2011.03.28
한정자(Type Qualifiers)  (0) 2010.10.19
Thread - 대기와 통지  (0) 2010.08.10
Java Inner Class  (0) 2010.08.10
Thread - 동기화 기법  (0) 2010.08.09
:
Posted by НooпeУ


Code Start Code End