C++ new / reference

jaeha_lee·2022년 5월 19일
0

malloc / new 비교

cmallocnew
종류함수연산자(키워드)
파라미터할당할 메모리 크기타입
반환타입void * (타입 캐스팅 필요)전달한 타입의 포인터
소멸freedelete OR delete[ ]
생성자생성자 호출 안됨생성자 호출됨
  • 배열 형태로 메모리 할당한 경우 반드시 "delete[ ]"로
int *p1 = new int;
delete p1;

int *p2 = new int[100];
delete[] p2;
// delete p2; // error

Reference

  • 이미 존재하는 변수(메모리)에 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
    }

c++ 버전 swap 구현

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;
   
}

const reference -> 어떤 경우에 사용하는가?

  • 함수에서 전달된 인자를 값만 사용하는 경우 복사본에 대한 오버헤드를 발생시키고 싶지 않을 때 사용한다.

    void func_call_by_value(int x){
    	x = 10; // 아무리 여기서 바꿔도 함수가 끝나면 원래 상태대로. 이 경우 오버헤드가 발생함
    }
    void func1(const int& x){
    	x = 10; // 애초에 값 바꾸는 것도 에러가 발생하며, 이렇게 사용하면 오버헤드 발생 X
       // 근데 그냥 int같은 자료형의 경우, 구조체가 아니면, call by value가 더 나음
    }

0개의 댓글