C++문법 기반의 동적할당.
int * p = new int;
new 연산자 : heap 영역에 메모리를 할당해주는 연산자.
동적할당과 동시에 초기화를 시킬 수 있게 되었다.
int *p = new int(100);
동적 배열을 만드는 법.
int* pArray = new int[4];
int* pArray = new int[4]{}; //할당과 동시에 초기화
메모리의 반환 : delete
delete p; //메모리의 반환.
→ 반환 후에 p의 값은 알지 못하는 주소로 바뀌게 되었다. 다만, 마찬가지로 접근해서 사용해서는 안되는 주소인 것은 마찬가지이기 때문에 끝난 후 nulptr 초기화가 반드시 필요함.
NULL = 0(리터럴) nulptr = 포인터 초기화
동적 배열의 반환
delete pArray; // 이건 아님.
delete []pArray //이렇게 사용하는 것이 맞음.
C++에서 동적 배열을 메모리에서 반환 할 시 [] 연산자를 앞에 기입해야 한다.
메모리 함수와 전처리기 문법.
C언어 시절부터 메모리 블럭 단위로 동작을 수행했던 함수들
MEMSET
memset(초기화 해주고자 하는 메모리 공간의 주소, 바이트당 초기화 값, 초기화를 수행하고 싶은 메모리의 크기);
내가 선언한 메모리 블럭을 ‘바이트’ 단위로 초기화하고 싶을 때 사용하고 싶은 함수. 즉, 전체 선언한 부분의 바이트를 다 0 혹은 1 혹은 무언가로 초기화 하고 싶을 때 사용. 주의 : 비트 단위 아님
MEMCPY
memcpy(복사 받을 대상의 주소, 복사할 데이터의 주소, 복사받을 공간의 크기);
메모리 복사함수 포문으로 돌려서 대입하는 것보다 월등하게 빠르다.
MEMMOVE
memmove(복사 받을 대상의 주소, 복사할 데이터의 주소, 복사받을 공간의 크기);
메모리 복사함수. 멤카피와 달리 임시 버퍼를 만든 후에, 임시 버퍼에 복사를 한 후에 다시 복사할 공간으로 복사해주는 것.(즉 멤 카피가 엄청 빠르다.)
Buffer(버퍼) : 데이터를 공간하고 있는 메모리 공간.
다만, 멤카피는 윈도우에서만 사용하는 것이고, 다른 개발 환경에서는 멤카피를 사용하지 못할 수도 있다.
전처리기
수업 시간에는 #pragma 문법은 다루지 않을 것임.
매크로 매크로의 종류는 두가지로 나뉨
- 함수 매크로
- 상수 매크로
상수 매크로
#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 ⇒ 프리컴파일 헤더. 한번만 컴파일