2014-06-08 12 views
5

Câu hỏi thứ nhất:Cách thích hợp để chuyển các tham số mảng tới hàm D

Tham số hàm mảng D luôn được truyền theo tham chiếu hoặc theo giá trị? Ngoài ra, ngôn ngữ có thực hiện Sao chép khi viết cho mảng không? Ví dụ:

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

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

Câu hỏi 2:

Giả sử tôi có một mảng lớn sẽ được chuyển sang cho hàm foo như một tham số chỉ đọc và nó nên tránh càng nhiều càng tốt sao chép mảng, vì nó được cho là một vật thể rất lớn. Những từ như sau (hoặc ai trong số họ) sẽ khai báo tốt nhất cho chức năng foo:

void foo(const int[] bigArray) 

void foo(in int[] bigArray) 

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

trong danh sách của bạn ở dạng no-op (dunno ở bất kỳ vị trí nào), hơn nữa, sử dụng const không thay đổi bất cứ nơi nào thích hợp bởi vì nó mạnh hơn const'ness – Quonux

Trả lời

10
  1. Về mặt kỹ thuật, một mảng động như int[] chỉ là một con trỏ và chiều dài. Chỉ có con trỏ và chiều dài được sao chép vào ngăn xếp, không phải nội dung mảng. An arr[0] = 42; sẽ sửa đổi mảng gốc.
    Ở phía bên kia, một mảng tĩnh như int[30] là loại dữ liệu cũ đơn giản bao gồm 30 liên tiếp int giây trong bộ nhớ. Vì vậy, một hàm như void foo(int[30] arr) sẽ sao chép 120 byte vào ngăn xếp để bắt đầu. Trong trường hợp này, arr[0] = 42; sửa đổi bản sao cục bộ của mảng.

  2. Theo như trên, mỗi cách bạn liệt kê tránh sao chép nội dung mảng. Vì vậy, cho dù bạn cần tham số là const, in, const ref hay cách khác phụ thuộc vào những gì bạn đang cố gắng đạt được ngoài việc tránh sao chép mảng. Ví dụ: nếu bạn chuyển thông số ref int [] arr, không chỉ bạn có thể sửa đổi nội dung của nó, mà còn có thể sửa đổi con trỏ và độ dài (ví dụ, tạo một mảng hoàn toàn mới và gán nó cho arr sao cho nó hiển thị bên ngoài chức năng).

Để biết thêm thông tin, vui lòng tham khảo các bài viết tương ứng trên trang web DLang bao gồm arraysarray slices.

Các vấn đề liên quan