프로그래밍C++ 백엔드 개발자

C++에서 매개변수 전달 방식(값 전달, 포인터 전달, 참조 전달)은 어떻게 구성되어 있으며 각 방식의 숨겨진 위험은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

C++에서는 함수의 매개변수(메서드의 멤버 포함)를 다음과 같이 전달할 수 있습니다:

  • 값 전달(by value): 함수 내에서 객체의 복사본이 생성됩니다. 원본은 변경되지 않지만 동적 자원이 있는 경우 잘못된 복사가 발생할 수 있습니다!
  • 포인터 전달(by pointer): 주소를 전달합니다. 원본을 수정할 수 있으며, nullptr의 가능성이 있고, 검사 및 메모리 소유권 부재로 인한 위험이 있습니다.
  • 참조 전달(by reference): 포인터 전달과 같지만 일반 변수와 같은 구문입니다. 참조는 유효해야 하며 리다이렉션이 불가능하지만 const로 인해 복사 오버헤드를 줄일 수 있습니다.

예:

void foo(int value); // 값 전달 void foo(int* ptr); // 포인터 전달 void foo(const int& ref); // 참조 전달 (큰 객체에 최적!)

참조로 전달 시 최적화(복사 생략)가 가능하고 큰 객체에는 const &를 권장합니다. 포인터를 사용할 때는 항상 nullptr를 확인하세요.

혼동을 주는 질문.

함수 매개변수에서 const MyClass& objMyClass obj의 차이점은 무엇인가요?

답변:

const MyClass&는 객체를 복사하지 않고 변경할 수 없는 접근을 제공합니다(큰 객체에 최적). MyClass obj는 항상 복사본을 만들기 때문에 큰 크기일 때나 올바른 복사 구현(예: 깊은 복사 없음)이 없을 때 비용이 큽니다.

void process(const std::string& s); // 복사하지 않음 void process(std::string s); // 복사함

주제에 대한 세부사항을 알지 못해 발생한 실제 오류의 예.


이야기 기업의 수학 구조 라이브러리에서 프로그래머는 큰 컨테이너를 값으로 전달하여 작업 속도를 높이려고 했습니다. 이로 인해 각 함수 호출 시 상당한 오버헤드가 발생하여 성능이 절반으로 떨어졌습니다.


이야기 사용자 관리 모듈에서 nullptr에 대한 검사를 하지 않은 포인터를 사용했습니다. 때때로 유효하지 않은 포인터에 접근할 때 무작위 오류가 발생하여 디버깅에 몇 달이 걸렸습니다.


이야기 이미지 처리 프로젝트의 일부 함수는 객체를 값으로 받고 일부는 참조로 받았습니다. 하나의 클래스에서 깊은 복사가 구현되지 않아 메모리가 새고 자원을 암묵적으로 공동 소유하게 되었습니다.