programing

정수를 상수 참조로 전달하는 것과 복사하기

coolbiz 2021. 1. 14. 22:59
반응형

정수를 상수 참조로 전달하는 것과 복사하기


이것은 어리석은 질문 일 수 있지만 많은 API에서 수정할 의도가없는 정수 매개 변수를 사용하는 많은 메서드 서명이 다음과 같이 보입니다.

void method(int x);

보다는 :

void method(const int &x);

나에게는이 두 가지가 똑같이 작동 하는 것처럼 보입니다 . (편집 : 어떤 경우에는 분명히 아닙니다 .R Samuel Klatchko의 답변 참조) 전자에서는 값이 복사되어 원본을 변경할 수 없습니다. 후자의 경우 상수 참조가 전달되므로 원본을 변경할 수 없습니다.

내가 알고 싶은 것은 왜 다른 것보다 성능이 기본적으로 동일하거나 전자와 더 좋기 때문입니까? 예를 들어 32 비트 또는 64 비트 주소가 아닌 16 비트 값 또는 32 비트 값을 전달합니까? 이 난 그냥이 맞다면 알고 싶어 생각할 수있는 유일한 논리적 인 이유이고,하지, 왜 경우 하나 선호한다 때 int x이상 const int &x반대 및 부사장.


포인터를 전달하는 비용 (본질적으로 참조)뿐만 아니라 기본 값을 검색하기 위해 호출 된 메서드의 본문에서 역 참조를 수행하는 것도 비용입니다.

그렇기 때문에 intby 값을 전달하는 것이 사실상 더 빠르다는 것이 보장됩니다 (또한 컴파일러는 int비아 프로세서 레지스터를 최적화하고 간단히 전달할 수 있으므로 스택에 푸시 할 필요가 없습니다).


나에게는이 두 가지가 똑같이 작동하는 것처럼 보입니다.

참조가 정확히 무엇인지에 따라 다릅니다. 다음은 참조를 전달하는지 값을 전달하는지에 따라 변경되는 인정되는 구성의 예입니다.

static int global_value = 0;

int doit(int x)
{
    ++global_value;
    return x + 1;
}

int main()
{
    return doit(global_value);
}

이 코드는 당신이 있는지 여부에 따라 다르게 작동합니다 int doit(int)또는int doit(const int &)


정수는 일반적으로 프로세서의 기본 단어 크기이며 레지스터로 쉽게 전달할 수 있습니다. 이러한 관점에서 값으로 전달하는 것과 상수 참조로 전달하는 것에는 차이가 없습니다.

확실하지 않은 경우 함수에 대한 어셈블리 언어 목록을 인쇄하여 컴파일러가 인수를 전달하는 방법을 확인하십시오. 값에 의한 전달과 상수 참조에 의한 전달 모두에 대해 인쇄합니다.

또한 값으로 전달할 때 함수는 복사본을 수정할 수 있습니다. 상수 참조로 전달할 때 함수는 변수를 수정할 수 없습니다 (const로 표시됨).


실제 값을 얻기 위해 최소한 하나의 역 참조가 발생해야하기 때문에 참조로 전달하기위한 매우 작은 최적화 해제가있을 것입니다 (호출이 인라인되지 않는 한 컴파일러는 단순히 값을 전달할 수 없습니다. 호출 사이트와 함수가 개별적으로 컴파일 될 수 있으며 const실제로 const자체 가 아닌 전달 된 매개 변수에 대해 캐스트하는 것이 유효하고 잘 정의되어 있다는 사실 입니다. const ref로 정수 유형을 전달하는 이점무엇입니까 ?를 참조하십시오 . 그러나 '최적화 해제'는 측정하기 어려울 정도로 작을 수 있습니다.

대부분의 사람들은 이것 때문에 내장에 대한 상수 참조를 싫어하는 것 같습니다. 그러나 함수 내에서 값이 실수로 변경되지 않도록 컴파일러가 도움을주기를 원하는 경우 어떤 경우에는 더 바람직 할 수 있다고 생각합니다. 큰 일은 아니지만 때로는 도움이 될 수 있습니다.


  • 기본 명령어 세트에 따라 정수 매개 변수가 레지스터 또는 스택으로 전달 될 수 있습니다. 레지스터는 메모리 액세스보다 확실히 빠르며 const ref의 경우 항상 필요합니다 (초기 캐시없는 아키텍처 고려).

  • int 리터럴을 const int &로 전달할 수 없습니다.

  • 명시 적 유형 변환을 사용하면 const int &를 * (const int *)로 캐스팅하여 전달 된 참조의 값을 변경할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/3009543/passing-integers-as-constant-references-versus-copying

반응형