Programing

함수에 벡터 전달, 값 대 참조 C ++

lottogame 2020. 10. 27. 07:49
반응형

함수에 벡터 전달, 값 대 참조 C ++


저는 C ++로 코딩하고 있습니다. 함수가 void foo(vector<int> test)있고 프로그램에서 호출하면 벡터가 값이나 참조로 전달됩니까? 벡터와 배열이 비슷하고 함수 void bar(int test[])가 값 대신 참조 (포인터?)로 테스트를 통과 한다는 것을 알고 있기 때문에 확실하지 않습니다 . 내 생각 엔 값으로 전달하지 않으려면 포인터 / 참조로 벡터를 명시 적으로 전달해야하지만 확실하지 않습니다.


내가 추측해야한다면, 나는 당신이 자바 배경 출신이라고 말할 것입니다. 이것은 C ++이며 &-operator를 사용하여 달리 지정하지 않는 한 값으로 전달됩니다 (이 연산자는 'address-of'연산자로도 사용되지만 다른 컨텍스트에서 사용됨). 이것은 모두 잘 문서화되어 있지만 어쨌든 다시 반복하겠습니다.

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifyable inside foo
void foo(vector<int> const &bar); // by const-reference

벡터 ( void foo(vector<int> *bar))에 대한 포인터를 전달하도록 선택할 수도 있지만 수행중인 작업을 알 수없고 이것이 정말로 갈 길이라고 생각하지 않는 한이 작업을 수행하지 마십시오.

또한 벡터는 배열과 동일 하지 않습니다 ! 내부적으로 벡터는 메모리 관리를 처리하는 배열을 추적하지만 다른 많은 STL 컨테이너도 마찬가지입니다. 포인터 또는 배열을 기대하는 함수에 벡터를 전달할 수 없으며 그 반대의 경우도 마찬가지입니다 (기본 배열에 액세스 (포인터)하여 사용할 수 있음). 벡터는 멤버 함수를 통해 많은 기능을 제공하는 클래스 인 반면 포인터와 배열은 내장 유형입니다. 또한 벡터는 동적으로 할당되며 (즉, 런타임에 크기가 결정되고 변경 될 수 있음) C 스타일 배열은 정적으로 할당되며 (크기는 일정하며 컴파일 타임에 알려야 함) 사용을 제한합니다.

일반적으로 C ++ (특히 array decay ) 에 대해 좀 더 읽어 보고 배열과 포인터의 차이점을 보여주는 다음 프로그램을 살펴 보는 것이 좋습니다.

void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
}

A vector는 배열과 기능적으로 동일합니다. 그러나 언어 vector는 유형 int이며 또한 유형입니다. 함수 인수에 대해 모든 유형 (포함 vector[]) 의 배열은 포인터로 처리됩니다. A vector<int>int[]컴파일러 와 동일하지 않습니다 . vector<int>비 배열, 비 참조, 비 포인터-값으로 전달되고 있으므로 copy-constructor를 호출합니다.

따라서 참조로 전달 하려면 vector<int>&( const함수가 수정하지 않는 경우 가급적으로와 함께 ) 사용해야합니다.


void foo(vector<int> test)

벡터는 이것의 값으로 전달됩니다.

컨텍스트에 따라 벡터를 전달하는 더 많은 방법이 있습니다.

1) 참조로 전달 :-이것은 함수 foo가 벡터의 내용을 변경하도록합니다. 벡터 복사를 피하므로 값을 전달하는 것보다 효율적입니다.

2) 상수 참조로 전달 :-함수가 벡터의 내용을 변경하지 않도록하려는 경우 효율적이고 신뢰할 수 있습니다.


함수의 값으로 벡터를 인수로 전달하면 단순히 벡터의 복사본을 생성하고 특정 함수를 호출 할 때 주 함수에 정의 된 벡터에는 아무런 영향도 미치지 않습니다. 특정 함수에 쓰여진 것이 무엇이든 참조로 벡터를 전달할 때, 모든 작업은 특정 함수를 호출 할 때 main 또는 다른 함수에 정의 된 벡터에서 수행됩니다.

참고 URL : https://stackoverflow.com/questions/26647152/passing-vectors-to-a-function-value-vs-reference-c

반응형