메모리 함수와 전처리기 문법.
C언어 시절부터 메모리 블럭 단위로 동작을 수행했던 함수들
MEMSET
memset(초기화 해주고자 하는 메모리 공간의 주소, 바이트당 초기화 값, 초기화를 수행하고 싶은 메모리의 크기);
내가 선언한 메모리 블럭을 ‘바이트’ 단위로 초기화하고 싶을 때 사용하고 싶은 함수. 즉, 전체 선언한 부분의 바이트를 다 0 혹은 1 혹은 무언가로 초기화 하고 싶을 때 사용. 주의 : 비트 단위 아님
MEMCPY
memcpy(복사 받을 대상의 주소, 복사할 데이터의 주소, 복사받을 공간의 크기);
메모리 복사함수 포문으로 돌려서 대입하는 것보다 월등하게 빠르다.
MEMMOVE
memmove(복사 받을 대상의 주소, 복사할 데이터의 주소, 복사받을 공간의 크기);
메모리 복사함수. 멤카피와 달리 임시 버퍼를 만든 후에, 임시 버퍼에 복사를 한 후에 다시 복사할 공간으로 복사해주는 것.(즉 멤 카피가 엄청 빠르다.)
Buffer(버퍼) : 데이터를 공간하고 있는 메모리 공간.
다만, 멤카피는 윈도우에서만 사용하는 것이고, 다른 개발 환경에서는 멤카피를 사용하지 못할 수도 있다.
매크로 매크로의 종류는 두가지로 나뉨
- 함수 매크로
- 상수 매크로
상수 매크로
#define EXAMPLE 50
이렇게 사용하게 된다면 EXAMPLE은 50으로 취급함. ’;’ 세미콜론 없음.
매크로는 치환의 형태로 구동하게 됨.
매크로의 장점 : 자료형이나 용량의 걱정이 없이 자주 사용하는 코드에 ‘아주 빠르게’ 코드에 적용시킬 수 있음.
매크로의 단점 : 컴파일 에러가 출력되지 않음(컴파일러가 인지하지 못함) → 디버깅이 어려움 런타임에 에러가 날 수 있기 때문에 조심해야 함. (함수 매크로에서 빈번하게 발생하기도 함.)
함수 매크로 함수의 형식을 띈 매크로 (함수가 아님) 코드를 호출하는 형태가 아닌, 삽입하는 형태로 구동함.
#define SQUARE(x) x*x
자료형을 걱정할 필요 없음.
SQUAR(2+2);
⇒ 2 + 2 * 2 + 2 가 됨.
그렇기에 함수 매크로를 만들 때에는 다음과 같은 형태로 하는 것이 권장된다.
#define SQUARE(x) (x)*(x)
#define if(x){\
cout <<"야호"; \
}
여러줄의 매크로일 경우, 마지막 줄을 제외하고 줄 끝에 역슬래쉬 \ 를 붙여야 함. 그렇기에 한줄로 사용하는 경우가 많음 (줄은 세미콜론으로 구분함) 그럼에도 주로 짤막한 코드를 만들 때 사용함.
#define SAFE_DELETE(p) if(p) {delete p; p = nulptr;}
조건부컴파일
컴파일 전에 조건 비교를 이용하여 코드라인의 문법을 컴파일 할 지 말 지 결정하는 문법
마지막에 반드시 #endif를 붙여주어야 함.
#endif : 조건문 컴파일이 종료되었음을 알리는 지시자.
#if
함수 바깥 / 안 쪽에 모두 사용할 수 있음.
#if(조건){
//조건이 참이면 아래 코드를 컴파일
}
#elif(){
}
#else{
}
#endif
#ifdef
전처리기가 정의가 되어 있다면 컴파일.
#ifdef(전처리기){}
#elif(){}
#else{}
#endif
#ifndef
전처리기가 정의되어 있지 않다면 컴파일 수행
pch.h ⇒ 프리컴파일 헤더. 한번만 컴파일