2016-01-25 17 views
8

Chúng ta biết rằng một Duff's device tận dụng interlacing các cấu trúc của một switch fallthrough và một vòng lặp như:Duff trong Swift

send(to, from, count) 
register short *to, *from; 
register count; 
{ 
    register n = (count + 7)/8; 
    switch (count % 8) { 
    case 0: do { *to = *from++; 
    case 7:  *to = *from++; 
    case 6:  *to = *from++; 
    case 5:  *to = *from++; 
    case 4:  *to = *from++; 
    case 3:  *to = *from++; 
    case 2:  *to = *from++; 
    case 1:  *to = *from++; 
      } while (--n > 0); 
    } 
} 

Bây giờ, trong Swif 2.1, switch-case control flows không mặc nhiên có fallthrough như chúng ta đọc trong docs Swift:

không Implicit Fallthrough

Ngược lại với tuyên bố chuyển đổi trong C và Objective-C, chuyển báo cáo trong Swift làm không t rơi xuống dưới cùng của mỗi trường hợp và vào ô tiếp theo theo mặc định. Thay vào đó, toàn bộ tuyên bố chuyển đổi hoàn thành việc thực thi ngay khi trường hợp chuyển đổi khớp đầu tiên được hoàn thành, mà không yêu cầu tuyên bố ngắt rõ ràng. Điều này làm cho tuyên bố chuyển đổi an toàn hơn và dễ sử dụng hơn trong C và tránh thực hiện nhiều trường hợp chuyển đổi do nhầm lẫn.

Bây giờ, cho rằng có một điều khoản fallthrough có một cách rõ ràng một tác dụng phụ fallthrough trong Swift:

Fallthrough

Chuyển phát biểu trong Swift không thuộc thông qua dưới cùng của mỗi trường hợp và vào kế tiếp. Thay vào đó, toàn bộ câu lệnh chuyển đổi hoàn thành thực thi ngay sau khi hoàn thành trường hợp khớp đầu tiên. Với độ tương phản , C yêu cầu bạn chèn tuyên bố ngắt rõ ràng ở đầu số của mọi trường hợp chuyển đổi để ngăn chặn sự sụt giảm. Tránh mặc định fallthrough có nghĩa là các câu lệnh chuyển đổi Swift ngắn gọn hơn nhiều và có thể dự đoán được so với các đối tác của chúng trong C, và do đó chúng tránh bị lỗi .

đó là khá nhiều như:

let integerToDescribe = 5 
var description = "The number \(integerToDescribe) is" 
switch integerToDescribe { 
case 2, 3, 5, 7, 11, 13, 17, 19: 
    description += " a prime number, and also" 
    fallthrough 
default: 
    description += " an integer." 
} 
print(description) 
// prints "The number 5 is a prime number, and also an integer." 

xem xét rằng như Wikipedia nhắc nhở cho chúng ta, các thiết bị đi ra khỏi vấn đề

A straightforward code to copy items from an array to a memory-mapped output register might look like this: 
do {       /* count > 0 assumed */ 
    *to = *from++;   /* "to" pointer is NOT incremented, see explanation below */ 
} while(--count > 0); 

Đó sẽ là việc thực hiện chính xác của một Thiết bị của Duff trong Swift?

Đây chỉ là một ngôn ngữ & câu hỏi mã hóa, nó không có ý định được áp dụng trong các ứng dụng Swift thực.

+0

Fallthrough là một khía cạnh thiết yếu của thiết bị Duff. Nếu không có nó, tôi không nghĩ rằng có tồn tại một thực hiện chính xác trong Swift. Trong Swift, bạn thậm chí không thể mô phỏng sự sụp đổ trong một câu lệnh Switch, vì vậy bạn sẽ phải sử dụng một chuỗi 'if then'statements thay thế. Không nhiều, tôi nghĩ vậy. –

+4

Eh ... đó là một tối ưu hóa từ năm 1983. Những thứ như bộ nhớ cache và dự đoán chi nhánh hầu như không được phát minh, hãy để một mình tối ưu hóa cao 'memcpy' triển khai. Tại sao bạn tối ưu hóa mã theo một số thuật toán thập niên 1980 và tại sao bạn nghĩ những thứ như vậy vẫn còn có liên quan ngày nay? – Lundin

+0

chỉ là một câu hỏi mã hóa/ngôn ngữ, không phải là một thực hiện thực sự cho một cái gì đó mà nên có liên quan ngày hôm nay. – loretoparisi

Trả lời

1

Bạn thể hiện ý định của mình ở mã mức cao nhất có thể và tin tưởng trình biên dịch Swift để tối ưu hóa nó cho bạn, thay vì cố tự tối ưu hóa nó. Swift là một ngôn ngữ cấp cao. Bạn không làm điều chỉnh vòng lặp mức thấp ở một ngôn ngữ cấp cao. Và trong Swift, đặc biệt, bạn không cần phải lo lắng về việc sao chép các mảng (ứng dụng gốc của Thiết bị Duff) vì Swift giả vờ sao chép một mảng bất cứ khi nào bạn gán nó, sử dụng "copy on write". Điều này có nghĩa rằng nó sẽ sử dụng cùng một mảng cho hai biến miễn là bạn chỉ đọc từ chúng, nhưng ngay sau khi bạn sửa đổi một trong số chúng, nó sẽ tạo ra một bản sao trong nền.

Ví dụ, từ https://developer.apple.com/documentation/swift/array Bản sao Sửa đổi của Mảng

Each array has an independent value that includes the values of all 
of its elements. For simple types such as integers and other structures, 
this means that when you change a value in one array, the value of that 
element does not change in any copies of the array. For example: 

var numbers = [1, 2, 3, 4, 5] 
var numbersCopy = numbers 
numbers[0] = 100 
print(numbers) 
// Prints "[100, 2, 3, 4, 5]" 
print(numbersCopy) 
// Prints "[1, 2, 3, 4, 5]"