c | malloc | new |
---|---|---|
종류 | 함수 | 연산자(키워드) |
파라미터 | 할당할 메모리 크기 | 타입 |
반환타입 | void * (타입 캐스팅 필요) | 전달한 타입의 포인터 |
소멸 | free | delete OR delete[ ] |
생성자 | 생성자 호출 안됨 | 생성자 호출됨 |
int *p1 = new int;
delete p1;
int *p2 = new int[100];
delete[] p2;
// delete p2; // error
이미 존재하는 변수(메모리)에 alias(별명)을 부여하는 것
& : 변수의 주소를 구할 때
int *p = &n;
& : 레퍼런스 변수를 선언할 때
int &r= n;
예시
void func1(int a) {++a;}
void func2(int* b){++(*b);}
void func3(int& c){++c;}
int main(){
int a=10,b=10,c=10;
func1(a); // call by value
func2(&b); // call by pointer
func3(c); // call by reference
}
void swap(int *a,int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
template <class T>
void swap_template(T& a, T& b){
T tmp = a;
a = b;
b = a;
}
int main(){
int x=10,y=20;
}
함수에서 전달된 인자를 값만 사용하는 경우 복사본에 대한 오버헤드를 발생시키고 싶지 않을 때 사용한다.
void func_call_by_value(int x){
x = 10; // 아무리 여기서 바꿔도 함수가 끝나면 원래 상태대로. 이 경우 오버헤드가 발생함
}
void func1(const int& x){
x = 10; // 애초에 값 바꾸는 것도 에러가 발생하며, 이렇게 사용하면 오버헤드 발생 X
// 근데 그냥 int같은 자료형의 경우, 구조체가 아니면, call by value가 더 나음
}