2014-06-08 4 views
5

첫 번째 질문 :배열 매개 변수를 D 함수에 전달하는 올바른 방법

D 배열 함수 매개 변수는 항상 참조 또는 값으로 전달됩니까? 또한 언어는 배열에 대한 쓰기 복사를 구현합니까? 예 :

void foo(int[] arr) 
{ 
    // is arr a local copy or a ref to an external array? 

    arr[0] = 42; // How about now? 
} 

두번째 질문 :

가정하자 나는 읽기 전용 매개 변수로 foo 기능하도록 전달됩니다 큰 배열을 가지고 있고 그것은 때문에, 배열을 복사 가능한 한 피해야한다 매우 큰 객체라고 가정합니다. 에서 어떤 다음 (또는 그들 중 누구도) 함수 foo에 가장 선언하지 않을 것이다 :

void foo(const int[] bigArray) 

void foo(in int[] bigArray) 

void foo(const ref int[] bigArray) 
+0

은 아무런 의미가없는 no-op이며, const를 사용하는 istead는 const'ness보다 강력하므로 적절하지 않은 변경이 가능합니다. – Quonux

답변

10
  1. 기술적으로, int[] 같은 그냥 포인터와 길이 인 동적 배열. 포인터와 길이 만 배열 내용이 아닌 스택에 복사됩니다. arr[0] = 42;은 원래 배열을 수정합니다.
    정적 배열 (int[30])은 메모리에 30 개의 연속적인 int으로 구성된 일반 오래된 데이터 형식입니다. 따라서 void foo(int[30] arr)과 같은 함수는 120 바이트를 스택에 복사하여 시작합니다. 이 경우 arr[0] = 42;은 배열의 로컬 복사본을 수정합니다.

  2. 위의 내용에 따르면 나열된 각 방법으로 배열 내용을 복사하지 않습니다. 따라서 매개 변수가 const, in, const ref이거나 그렇지 않으면 배열 복사본을 피하는 것 이외에 달성하려는 대상에 따라 매개 변수가 필요한지 여부에 따라 다릅니다. 예를 들어 ref int [] arr 매개 변수를 전달하면 해당 내용을 수정할 수있을뿐만 아니라 포인터와 길이를 수정할 수 있습니다 (예 : 완전히 새로운 배열을 만들고이를 arr에 할당하여 함수 외부).

자세한 내용은 arraysarray slices를 덮고있는 DLang 사이트의 해당 문서를 참조하십시오.

관련 문제