수학적 의미에서 매핑을 나타내는 몇 가지 클래스, 즉 f : RxR^n -> R^n을 구현합니다. 나는 하나의 추상 기본 클래스를 구현하고 싶다 : 1) 참조로 std :: array를 가져 와서 또는 2) std :: array를 반환한다. (값 또는 참조에 의해 확실하지 않은가?)std :: array를 반환합니다.
옵션 2의 구문은 코드가 더 많이 표현하려고하는 것처럼 보이기 때문에 더 바람직합니다.하지만 불필요하게 물건을 복사하고 원하지 않는 것을 유도하고 싶습니다. 간접비. 예를 들어 내가이 있다면 :
// Function f declaration
std::array<double, 4> f(double t, const std::array<double, 4> & x);
// Some code snippet that uses f
std::array<double, 4> x = {0.0, 1.0, 2.0, 3.0};
double t = 0.0;
std::array<double, 4> dxdt = f(t, x);
내가 복사본을 마지막 줄에 수행되고 있는지 여부를 확인할 수 있습니다, 또는 나는 그것이
이 발생하지 않는다는 것을 어떻게 보장 할 수 있습니까
?
f()의 정의 내에서 복사 생성자를 호출하지 않고 이것이 반환되도록하려면 무엇이 필요합니까? 클라이언트가 포인터 나 스마트 포인터를 사용할 필요가 없도록 간단하게 사용하고 싶습니다만, 이것이 필요한 것일 수 있습니까?
void를 반환하도록 변경할 수 있으며 인수 중 하나를 std :: array dxdt로 지정해야하지만 성능 저하 또는 메모리 누수 문제가없는 한 반환 값 구문이 더 좋습니다.
고마워! 내 함수 호출의 마지막 매개 변수를 "출력"매개 변수로 사용하겠습니다. 왜냐하면 함수 호출이 보유 할 변수를 선언 할 때와 같은 줄에서 발생하지 않을 수 있기 때문입니다 반환 값, 그리고 이런 식으로, 나는 어떤 사본도 만들어지지 않는다는 것을 확실히 알고있다. – hazelnusse
@ hazelnusse : 그렇게 할 수 있다면 반환 값을 "출력 매개 변수"로 지정하면 모든 반환 문이 분명하게 동일한 변수를 반환 할 수 있습니다. 따라서 명명 된 반환 값 최적화가 시작됩니다. 그래서 ... 무엇이 문제입니까? –
@hazelnusse : "... 같은 줄에는 ... 일어나지 않는다" "회선"에 관해서는 이야기하지 않았다. ... 내가 얻지 못한 것이 있는가? –