캐스트 연산자와 return, 레퍼런스 관련...

vani2의 이미지

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

음..

shint의 이미지

1번은
operator Time()이것이 그냥은 호출이 안되네요.
operator int() 이렇게 하면 호출이 됩니다.
Time& operator =(Time in) 이것도 됩니다.

2번은 리턴값이 Time이라서 Time을 만들어준거 아닐까요? ㅡ_ㅡ??

3번은 상황에 따라 다르지 않을까요? ㅡ_ㅡ;;

4번은 한번 테스트 해보면 될거 같은데요. ㅇ_ㅇ;;
이거 참고해보세요.

#include <windows.h>
 
//	SYSTEMTIME st;
//	GetLocalTime(&st);
LARGE_INTEGER t_start, t_end, t_tick, t_diff;
DWORD dwStart, dwEnd, dwTick;
void fn_start_timer()
{
	dwStart = GetTickCount();
	QueryPerformanceCounter(&t_start);
}
 
double fn_end_timer()
{
	double timeSecond;
	QueryPerformanceCounter(&t_end);
	QueryPerformanceFrequency(&t_tick);
 
	t_diff.QuadPart = t_end.QuadPart - t_start.QuadPart;
	timeSecond = (double) ((double)t_diff.QuadPart/(double)t_tick.QuadPart);
 
	dwEnd = GetTickCount();
	dwTick = dwEnd - dwStart;
//	TRACE ("Elapsed CPU time:   %3.12f  sec / ticksPerSecond: %I64Ld\n", timeSecond, t_diff.QuadPart);
	printf ("CPU time: %5.12f sec / ticksPerSecond: %11I64Ld / Tick: %5ld\n", timeSecond, t_diff.QuadPart, dwTick);
	return timeSecond;
}

댓글 첨부 파일: 
첨부파일 크기
Plain text icon main.txt3.71 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

cleol의 이미지

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는 최후에 선택할 방법입니다.

vani2의 이미지

그렇군요.

함수 선언의 좋은 파이프라인을 알려주셔서 감사합니다.

잘 이해가 되었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.