Development Tip

왜`std :: initializer_list`는 종종 값으로 전달됩니까?

yourdevel 2020. 11. 28. 12:33
반응형

왜`std :: initializer_list`는 종종 값으로 전달됩니까?


나는 거의 모든 게시물에서를 포함하여 std::initializer_list사람들이 std::initializer_list을 전달하는 경향이 있습니다. 이 기사에 따르면 :

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

전달 된 객체의 복사본을 만들려면 값으로 전달해야합니다. 그러나 복사는 std::initializer_list좋은 생각이 아닙니다.

복사는 std::initializer_list기본 개체를 복사하지 않습니다. 원래 이니셜 라이저 목록 개체의 수명이 끝난 후에는 기본 배열이 존재한다고 보장 할 수 없습니다.

그렇다면 왜 그것의 인스턴스 const&는 불필요한 복사본을 만들지 않는 보장 된 값이 아닌 값으로 전달 되는가?


싸기 때문에 가치로 전달됩니다. std::initializer_list씬 래퍼 인은 포인터 쌍으로 구현 될 가능성이 높으므로 복사는 참조로 전달하는 것만 큼 저렴합니다. 또한, 우리는 실제로 복사를 수행하지 않고 대부분의 경우 인수가 어쨌든 임시로 구성되기 때문에 (보통) 이동을 수행하고 있습니다. 그러나 이것은 성능에 영향을 미치지 않습니다. 두 포인터를 이동하는 것은 복사하는 것만 큼 비쌉니다.

다른 한편으로, 사본의 요소에 액세스 하는 것은 하나의 추가 역 참조 (참조의 참조)를 피 하므로 더 빠를 수 있습니다 .


아마도 같은 이유로 반복자는 거의 항상 값으로 전달됩니다. 반복자를 복사하는 것은 "저렴한"것으로 간주됩니다. 의 경우 initializer_list대부분의 인스턴스가 사소한 소멸자가있는 임시 인스턴스이므로 컴파일러는 복사본없이 함수 인수를 넣는 위치에서 직접 인스턴스를 생성 할 수 있습니다. 마지막으로, 반복자와 마찬가지로 호출 된 함수가 값을 수정하려고 할 가능성이 있습니다. 즉, const에 대한 참조로 전달 된 경우 로컬로 복사해야합니다.

편집하다:

일반화하기 위해 : 표준 라이브러리는 일반적으로 iterators, initializer_lists 및 함수 객체를 값으로 전달하는 것이 더 낫다고 가정합니다. 따라서 디자인 한 모든 반복기, iterator_lists 또는 함수 객체가 복사 비용이 적게 드는지 확인해야하며 복사 비용이 저렴하다고 자신의 코드에서 가정해야합니다. const에 대한 참조를 사용할 때와 값을 사용할 때에 대한 전통적인 규칙은 다음을 반영하도록 수정해야합니다.

반복기, initializer_lists 또는 함수 객체 이외의 클래스 유형에 대해 const에 대한 참조로 전달을 사용하십시오. 그렇지 않으면 값으로 전달을 사용하십시오.

참고 URL : https://stackoverflow.com/questions/17803475/why-is-stdinitializer-list-often-passed-by-value

반응형