no swim no life
CODE complete, 13: 특이한 데이터 형 본문
구조체
데이터 관계를 이해하기 쉽게 하기 위해서 구조체를 사용
포인터
- 메모리 상의 위치 (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