no swim no life

CODE complete, 13: 특이한 데이터 형 본문

work/fundamental

CODE complete, 13: 특이한 데이터 형

달려간다 2009. 1. 31. 00:05

구조체

데이터 관계를 이해하기 쉽게 하기 위해서 구조체를 사용

포인터

  • 메모리 상의 위치 (32bit)
  • 메모리의 내용을 해석하는 방법 (type)
  • 포인터 오류의 빠른 발견이 중요
    • 포인터를 선언과 동시에 정의
    • 포인터를 할당된 곳과 같은 영역 내에서 삭제
    • dog-tag 필드의 사용
      • start-bit와 end-bit를 사용할 수 있으며 dog-tag는 포인터 영역의 상태를 표시
    • 여분의 포인터 변수를 사용
    • 포인터 연산을 단순화시킴으로써 발생하는 성능 향상
    • 연결 리스트나 서로 다른 깊이의 포인터들을 올바른 순서로 삭제
    • 경우에 따라 임시 메모리를 유지하여 메모리 부족시에 이용
  • 중요한 데이터는 메모리를 해제하기 전에 쓰레기 데이터(0xcc)로 덮는다.
  • wapping function 사용
    • 메모리를 삭제하거나 해제한 다음 포인터를 NULL로 설정
    • 포인터가 이미 해제되거나 삭제되었는지 체크
    • 포인터 할당 리스트를 유지

C++ 포인터

  • Smart pointer를 사용
  • Pass by Reference 매개변수에 포인터를 사용하고 Pass bu Value 매개변수에 const &를 사용
typedef struct {
    int x;
    int y;
} pass_by_st;

static void fn_pass( const pass_by_st &st_ref, pass_by_st *st_ptr )
{
    //_ read only (.)
    printf( "st_ref.x = %d\n", st_ref.x );
    printf( "st_ref.y = %d\n", st_ref.y );
    printf( "\n" );

    printf( "st_ptr->x = %d\n", st_ptr->x );
    printf( "st_ptr->y = %d\n", st_ptr->y );

    printf( "\n" );

    //st_ref.x = 9; //< error C2166: l-value specifies const object
    st_ptr->x = 9;

    printf( "st_ref.x = %d\n", st_ref.x );
    printf( "st_ptr->x = %d\n", st_ptr->x );
}

int main( int argc, char *argv[] )
{
    pass_by_st st_pass;

    st_pass.x = 1;
    st_pass.y = 2;

    fn_pass( st_pass, &st_pass );

    return 0;
}

 

전역 데이터

전역 변수가 항상 오류를 유발하지는 않더라도, 프로그램을 작성하는 최고의 방법이라고 말하기는 어렵다.

  • 전역 데이터를 사용할 때 발생하는 일반적인 문제점
    • 정보 은닉과 모듈화에 위배
    • 큰 프로젝트의 이해도와 유지 보수성을 저해
    • 전역 변수에 대한 부주의한 변경 (multi-thread 환경에서 특히...)
    • 코드의 재사용을 방해 (copy & paste)
  • 전역 데이터 사용의 예
    • const named를 흉내
    • 매우 자주 사용되는 데이터에 대한 능률적인 사용
    • wapper를 사용 (정보은닉 & 데이터에 대한 제어의 집중)
    • 전역변수에 대한 접근을 제어하기 위한 locking을 사용 (semaphore, mutex)

'work > fundamental' 카테고리의 다른 글

표준안 및 호환성 지정 매크로  (0) 2009.01.31
CODE complete, 12: 기본 데이터 형  (0) 2009.01.22
CODE complete, 11: 변수 이름의 효과  (0) 2009.01.09
Comments