다음과 같은 일반 코드가 있는데, 일부 메모리에서 뷰를 구현하는 클래스가 있으며 다양한 방법으로이 클래스를 만들 수 있습니다. 일부 데이터 처리 기능에 일관된 인터페이스를 제공하는 데 사용됩니다. View
방법을 참조 또는 값으로 리턴되어야 하는지를 참조 및 값 및 Const 문제에 의한 C++ 전달
class CView
{
...
int m_size;
float *m_data;
};
class CObjectA
{
...
CView m_view;
const CView View() const { return m_view; } // returned
CView View() { return m_view; } // returned
};
class CObjectB
{
...
const CView View() const { return CView(.....); } // constructed
CView View() { return CView(.....); } // constructed
};
void ProcessAdd(CView &dst, const CView &src1, const CView &src2);
void ProcessReverse(CView &dst, const CView &src);
void ProcessMul(CView &dst, const CView &src1, const CView &src2);
는 이제 궁금하고
Process
방법 참조 또는 값을 사용해야하는지 여부도.
컴파일러가 나를보기() 메서드를 만들 수 없습니다 것 같다
CObjectA a1, a2;
CObjectB b1;
... init these somehow
ProcessAdd(a1.View(), b1.View(), a2.View());
사본을 반환하고 Process
기능에 참조로 전달합니다 나는 복사를 최소화하지만, 뭔가를 할 수있는 능력을 유지하려는.
View
개체는 상당히 가볍고 읽을 수 있거나 수정할 수있는 데이터를 나타냅니다.
View
방법 대신 CView &
유형의 CView
을 반환하는 경우, 이것은 내가이이 Process
함수에 통과 할 때 이중 복사가있을 것이라는 점을 의미 하는가? 원하는 행동을 얻는 가장 효율적인 방법은 무엇입니까?
다른 문제는 const 정확성을 구현하는 올바른 방법은 무엇입니까? 사실 프로세스 함수가 CView
클래스의 멤버 변수를 변경하는 것을 원하지는 않지만 CView
클래스의 데이터 포인터가 출력보기 인 Process
의 첫 번째 매개 변수가 아닌 const 데이터를 가리 키도록해야합니다. 값으로 전달하면 아마도 const 한정자를 가질 필요가 없다는 말입니까?
만약 프로세스 함수 인수가 값에 의해 전달된다면'CView' 객체는 두 번 복사 될 것입니다 :'View' 메소드에서 한 번, 함수 호출에서 한번 또는 컴파일러가 충분히 똑똑하지 않습니까? – Robotbugs
@Robotbugs 그건 정말 좋은 질문입니다. C++ 표준에 정의되어 있는지 여부 또는 정의되지 않은 상태인지 여부는 확실하지 않습니다. – derekerdmann
@Robotbugs 예가 있습니까? 이 표준은 다양한 상황에서 복사본을 구현할 수있게 해줍니다. 이것은 가장 유명한 컴파일러/플랫폼 조합에서 잘 구현됩니다. 그러나 악마는 그 방식대로 세부 사항에 있습니다. – juanchopanza