본문 바로가기

Programming/C language

Chapter 15. 변수와 상수 고급 이론

Compiler 최적화 


높은 성능을 위해 compiler가 compile할 때 필요없는 코드를 생략하는 것 

자료(변수) 중심, 의존성을 가지고 판단한다. 


즉, 특정 변수(자료)에 대해 의존성이 존재하는 연산들을 구별할 수 있어야한다. 


변수가 적을수록 좋다.


변수가 많을수록 의존성이 높아지게되고, 논리적 구조가 복잡해진다  -> 최적화가 어렵다 

=> 최적화된 코드를 작성하기 위해 노력해야한다. 

= compiler가 최적화하기 좋게 작성해야한다.


최적화 방해요소


1. 변수가 많은 경우 -> 최대한 변수의 개수를 줄인다. 


2. 포인터 사용주의 (자제) - 주소가 runtime에 결정나기 때문에



형한정어


const 

변수를 상수화 해 그 변수의 메모리를 '읽기 전용' 메모리로 만들어주는 기능


나중에 변경될 가능성이 있는 처리조건을 상수화

=> 여러 처리 조건을 한번에 바꿈으로서 유지 보수 향상   


중간에 변경이 불가능 해짐으로 오류방지 


특정 숫자를 변수에 넣어 좀 더 의미가 명확해보이는 상수를 만들 수 있다.  =>  Symbolic 상수라고도 한다. 


포인터에도 사용할 수 있다. 


const char* pszBuffer vs char* const pszBuffer

  

전자 : 포인터 변수가 가리키는 대상을 상수화 

  간접 지정으로 포인터가 가리키는 내용을 변경할 수 없다. 


후자 : 포인터 변수를 상수화 

  포인터가 가리키는 대상을 바꿀 수 없다. => 사용하면 최적화 시 상수가 되므로 좋다. 


특정 기준에 대한 숫자 입력은 하드코딩(숫자를 직접 쳐넣는 것)으로 하지말고 symbolic 상수로 만들어라. 


또 다른 symbolic 상수 : #define 



volatile

AVR, 임베디드 프로그래밍을 할 때, 종종 컴파일 최적화를 하지말아야 하는 경우가 있는데, 이를 위한 형 한정어


volatile이 들어간 변수와 의존성이 있는 변수는 최적화를 하지 않는다. 



선언 및 정의


선언 - 개념(추상적)     ->    문법    ->    compile time

정의 - 구현               ->    Link


관리 -> 코드 분할 (여러 ~.c 파일)     => 분할 compile 

선언 : ~.h, 정의 : ~.c


obj file 앞쪽에 Symbolic table이 있는데, 거기에 이 obj에 어떤 함수, 변수 정의가 있는지를 적어둔다. 

linker가 필요한 함수, 변수를 Symbolic table에서 찾아 붙이는 역할을 한다. 


선언이 되어있지 않은 경우 -> compile error

선언은 있지만 정의가 없는 경우 -> link error 

선언은 있고 정의가 두개 이상인 경우 -> link error


extern

변수의 정의가 외부 file에 있다고 알려주면서 선언만 하는 방법 


형 재선언

 새로운 자료형을 선언하는 문법 


주의해서 사용한다. (특별한 경우가 아니고서는 사용을 자제한다.) 


특별한 경우 : 구조체, 열거형 상수 

자제해야하는 경우 : 기본형식을 재선언하는 경우 ex) unsigned int -> UINT - 가독성을 떨어뜨릴 수 있다. 


코딩 컨벤션 - Google C++ style guide 를 참고


typedef

 

열거형 상수

여러 symbolic 상수를 한꺼번에 정의해 사용자 정의 자료형으로 활용 

유지보수, 가독성에 좋다. 

switch case 문에 사용하기 좋다. 




연습문제)


1)  'const int *pnData'와 'int* const pnData'라는 선언은 모두 int형에 대한 포인터 변수 선언입니다.

그러나 const 형한정어가 적용된 대상이 다릅니다. 구체적으로 무엇이 어떻게 다른지 기술하세요. 


Q )

const int *pnData 는 포인터의 대상이 되는 int를 const한 것으로, 포인터의 간접 지정을 통해 포인터가 가리키는 값이 변경될 수 없도록 하는 

것 이고, int* const pnData는 포인터 변수인 pnData를 const한 것으로, 포인터의 간접 지정 대상을 변경할 수 없게 만드는것이다. 



2) 심볼릭 상수를 정의할 수 있는 두 가지 방법이 무엇인지 답하세요. 



Q )

const, #define 



3) 외부 변수를 선언하기 위한 예약어는 무엇인지 답하세요. 



Q )

extern



4)  게임을 개발하면서 최상위, 바닥, 왼쪽, 오른쪽에 해당하는 정보를 열거형 상수로 정의하려 합니다. 만일 열거형

상수의 이름을 'MYMOVE'라고 하고 속한 값으로 TOP, BOTTOM, LEFT, RIGHT를 선언하려 합니다. 어떻게 해야

하는지 코드를 기술하세요.



Q )

typedef enum MYMOVE { TOP = 100, BOTTOM = 200, LEFT = 300, RIGHT = 400 } MYMOVE;




- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼) 






'Programming > C language' 카테고리의 다른 글

Chapter 17. 함수에 대한 고급이론  (0) 2017.07.05
Chapter 16. 전처리기  (0) 2017.07.04
Chapter 14. 파일 입출력  (0) 2017.07.03
Chapter 13. 구조체와 공용체  (0) 2017.07.02
Chapter 12. 함수 응용 (문제풀이)  (0) 2017.06.30