함수 내부에 선언된 객체는 무엇인가? 말 그대로 함수 내부에서 객체가 선언된것을 뜻한다. 무슨 특징을 가지고 있는가? 객체는 스택에 올라 가게 되고, 자동적으로 존재할수 있는 범위(scope)를 지니게 된다. 왜 이것을 참조자로 반환하면 안되는가? 간단하다. 함수가 리턴되고, 바로 .. 객체는 사라진다. 이때 리턴된 참조자는 유효하고, 참조자가 참조하는 객체는 무효하다. 여기서 문제가 발생된다. 관령링크 http://ikpil.tistory.com/441
참조자 검색 결과
참조자를 왜 반환해도 되지 않나? 매개변수가 참조자이고, 그 참조자를 반환하는 경우에는 상관이 없다. 하지만, 함수 내부에서 선언된 객체의 경우에는 크게 잘못 된다. 그 이유는 어디에 있나? .. RAII 방식을 이해 했다면 그 이유를 알수 있을 듯 하지만, 설명하자면, 스택에 올라간 객체는 존재 할수 있는 범위(Scope)가 있다. 함수 내부에 선언(스택에 올려진)된 객체의 경우, 함수 종료 후 전기적 쇼크로 날라 간다. 그러므로 안에 있던 객체를 참조자로 리턴하게 되면 큰일난다. 그러면, 생성되고 소멸되는 객체를 어떻게 최적화 시키나? 리턴 타입을 임시객체 형태로 하기만 하면, 컴파일러가 알아서 처리해 준다. 이런 방법은 많은 컴파일러 회사들이 지원하고 있으며, 흔히들 "RVO(return value..
'값에 의한 전달' 이란 무엇을 뜻하는 것일까? 함수에 전달되는 인자를 복사하여 전달되는 방식 '상수객체 참조자에 의한 전달'이란 무엇을 뜻하는 것일까? 포인터나 레퍼런스 즉 * 나 & 로 전달하는 방식을 뜻한다. 상수 이므로 const type * 나 const type& 을 뜻한다. 둘의 차이점이 있다면 무엇일까? 복사 할때 들어가는 비용에 차이가 있다. 값에 의한 전달은 전달되는 인자의 크기가 크면 클 수록 복사 되는 비용이 점점 많이 지불해야 할것이다. 하지만 상수객체 참조자는 주소값인 4Byte(64bit 환경에선 8Byte)의 비용만 지불하면 되기 때문에 그 비용은 일정하다. 또한 참조에 의한 전달 방식은 슬라이싱 문제(복사 손실 : Slicing problem)가 없어진다. 그렇다면 무엇이 ..
이유 1. 예외처리 중 객체의 유효범위(scope)를 벗어날수 있기 때문에 포인터로는 받을수 없다(있지만 복잡함) 2. 1번의 경우때문에 값을 복사 해서 넘기는 방법이 편하지만 효율적인 면에서 두번의 복사가 부담스러움 3. 2번의 경우는 슬라이스 문제(클래스 계통에 따른 정적복사는 값이 짤려 나갈 경우가 있음)가 도사리고 있음 구현 방법 1. try 에선 값으로 보내고 catch 에선 참조자(레퍼런스)로 받아 주면 된다. 코드 try { // Validation_error는 exception으로부터 파생 된 객체이다. 그러므로 임시 객체 생성된것을 전달함 if(유효성 검사 실패했을 경우) throw Validation_error(); 된것임 } catch (exception &ex) { // 처리 하고~..
항목 1 : 포인터와 참조자를 구분하자. 개념 정리 포인터(pointer)는 NULL 을 가질수 있다. 참조자(reference)는 NULL 을 가질수 없다. 그렇기 때문에 C++ 스펙에는 참조자는 선언과 동시에 정의해야 한다. 그리고 참조자는 초기에 참조하고 있는것만 참조 할수 있으며, 다른 객체로 바꿀수 없다. 이유 1. 더 효율적인 코딩이 가능해 진다. 해결 방법 1. 각각 어떨때 쓰는지 알아 두어야 한다. 포인터(pointer)는 가리키는 객체의 주소가 없을 때가 있거나, 하나의 포인터로 여러개의 객체를 가리킬 필요가 있을 때 참조자(reference)는 가리키는 객체의 주소가 시작부터 끝까지 있거나, 오직 한개의 객체만 가리킬 때 여기에 참조자(reference)를 쓸때가 한가지 더 있다. op..
최근댓글