캐스트 연산자와 return, 레퍼런스 관련...
글쓴이: vani2 / 작성시간: 수, 2013/09/25 - 6:45오후
1) 다음과 같은 코드는 의미 없는 코드인가요?
class Time { private: int hour,min,sec; public: operator Time() { return 12345; }//자기자신을 갖는 변환함수? Time(int abssec,int dld=0) { hour=abssec/3600; min=(abssec/60)%60; sec=abssec%60; cout<<"객체생성"<<endl; } ~Time() { cout<<"객체파괴"<<endl; } void OutTime() { printf("현재 시간은 %d:%d:%d입니다.\n",hour,min,sec); } };
2) 함수에서 객체를 return 할 때 복사생성을 하는 이유가 무엇인가요?
Time Tm(int t){ Time temp(t); return temp //이부분에서 복사생성이 일어나는 이유는 무엇인가요? }
3) 변환생성자를 만들때 Call by Value가 좋을까요, Call by Reference가 좋을까요?
class Ex { ... } class Ex2 { ... Ex2(Ex ex) { ... } or Ex2(const Ex& ex) { ... } };
제 생각엔 Call By reference가 더 효율이 좋을 것 같다고 생각하는데... 어떨까요?
4) 다음 코드는 Opencv2의 웹캠 코드입니다. 그런데 imshow()함수의 2번째인자가 객체의 레퍼런스를 받지않고 값을 받던데... 오히려 성능 저하가 되는건 아닌지... 아니면 꼭 그렇게 한 이유가 있나요? (그런데 string은 레퍼런스로 받고있네요...)
imshow 프로토타입: CV_EXPORTS_W void imshow(const string& winname, InputArray mat);
using namespace cv; int main(int argc, char* argv[]) { VideoCapture stream(0); if(!stream.isOpened()){ return EXIT_FAILURE; } while(true) { Mat mt; stream.read(mt); imshow("웹캠",mt); if (waitKey(30) >= 0) break; } return EXIT_SUCCESS; }
음..
Forums:
결과입니다.
1번은
operator Time()이것이 그냥은 호출이 안되네요.
operator int() 이렇게 하면 호출이 됩니다.
Time& operator =(Time in) 이것도 됩니다.
2번은 리턴값이 Time이라서 Time을 만들어준거 아닐까요? ㅡ_ㅡ??
3번은 상황에 따라 다르지 않을까요? ㅡ_ㅡ;;
4번은 한번 테스트 해보면 될거 같은데요. ㅇ_ㅇ;;
이거 참고해보세요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
1) 의도를 모르겠습니다. 2) 복사 생성이 일어나지
1) 의도를 모르겠습니다.
2) 복사 생성이 일어나지 않습니다. RVO와 copy elision에 대해서 알아보세요.
3) Ex 타입의 크기에 따라 다릅니다. 크기가 크지 않다면 복사가 좋습니다. 크다면 const reference로 받는 것이 좋겠지요.
copy elision을 기대할 수 있지만 항상 되는 것은 아니니까요.
4) InputArray 객체가 실제로 데이터를 가지고 있는 지 아니면 데이터에 대한 포인터를 가지고 있는 것인지 확인해보세요.
후자이고 얕은 복사를 한다면 복사가 비쌀 이유가 없지요.
아니면 단순히 전달된 객체를 변경하기 때문일수도 있지요.
프로그램이 버그가 적고 이해하기 쉬우려면 함수 호출 시에 가능한 한 (reference나 pointer가 아니라) value를 주고 받는 것이 좋습니다.
많은 경우에 컴파일러가 copy elision 최적화를 해줍니다.
그리고 value로 전달된 객체는 함수의 바깥 세상과 관계가 없기 때문에 컴파일러가 다른 최적화를 하기도 좋습니다.
사람 뿐 아니라 컴파일러도 프로그램을 이해하기 쉬운거지요.
copy elision을 기대할 수 없어서 복사 비용 문제가 걱정된다면 인자는 const reference로 받을 수 있습니다.
c++11이라면 move를 사용할 수 있는 경우인지 살펴보는 것도 한 가지 방법입니다.
nonconst reference나 nonconst pointer는 최후에 선택할 방법입니다.
그렇군요.함수 선언의 좋은 파이프라인을 알려주셔서
그렇군요.
함수 선언의 좋은 파이프라인을 알려주셔서 감사합니다.
잘 이해가 되었습니다.
댓글 달기