> 백엔드 개발 > C++ > 대형 개체에 대한 값별 전달이 C 11의 기본값이어야 합니까?

대형 개체에 대한 값별 전달이 C 11의 기본값이어야 합니까?

Patricia Arquette
풀어 주다: 2024-12-02 17:35:11
원래의
366명이 탐색했습니다.

Should Pass-by-Value Be the Default in C  11 for Large Objects?

C 11에서 값별 전달 다시 생각하기

전통적인 C에서는 값을 함수에 전달하면 대형 개체에 대한 성능 저하가 발생했습니다. . 따라서 C 프로그래머는 참조별 전달을 선택하여 속도를 향상시키지만 특히 힙 할당 개체의 경우 소유권 및 메모리 관리가 복잡해졌습니다.

C 11에서는 Rvalue 참조 및 이동 생성자를 도입하여 효율적인 전달을 가능하게 했습니다. - std::벡터 및 std::string과 같은 대형 객체의 값입니다. 이는 값에 의한 전달이 그러한 유형의 기본값이 되어야 하는지에 대한 의문을 제기합니다.

값에 의한 전달: 새로운 기본값?

Dave Abrahams에 따르면, 함수 내에서 복사가 필요한 경우 값별 전달이 선호되는 기본값이 될 수 있습니다. 컴파일러가 복사를 처리하도록 허용함으로써 프로그래머는 명시적인 복사 작업을 피할 수 있습니다.

void foo(T t) {
    // ...
}
로그인 후 복사

참조로 전달하는 것과 비교:

void foo(T const& t) {
    auto copy = t;
    // ...
}
로그인 후 복사

값으로 전달은 호출자에게 유연성을 제공합니다. :

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue
로그인 후 복사

예외 값별 전달

값별 전달은 일부 유형에 적합할 수 있지만 const를 참조하여 전달하는 것은 여전히 ​​합리적인 옵션입니다.

  • 객체 복사하면 안되는 항목: 참조를 전달하면 불필요한 복사본이 만들어지지 않습니다.
  • 대형 값으로 자주 전달되는 객체: 이동 의미론을 사용하더라도 복사 작업은 여전히 ​​비용이 많이 들 수 있습니다.
  • 스레드 간에 전송되는 객체: 참조로 전달하면 효율적인 스레드 동기화가 가능합니다.

위 내용은 대형 개체에 대한 값별 전달이 C 11의 기본값이어야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿