2015-04-01 14 views
8

Từ những gì tôi hiểu, các chuỗi trong Nim về cơ bản là chuỗi byte có thể thay đổi và chúng được sao chép khi gán.Những gì chính xác là chuỗi trong Nim?

Cho rằng, tôi cho rằng sizeof sẽ cho tôi biết (như len) số byte, nhưng thay vào đó nó luôn mang đến cho 8 trên máy tính 64-bit của tôi, vì vậy nó có vẻ là giữ một con trỏ.

Cho rằng, tôi có câu hỏi sau đây ...

  • động lực đằng sau bản sao trên phân là gì? Có phải vì họ có thể thay đổi không?

  • Có bao giờ một thời gian khi nó không được sao chép khi được chỉ định không? (Tôi cho rằng các thông số chức năng không var không sao chép. Bất kỳ điều gì khác?)

  • Chúng có được tối ưu hóa sao cho chúng thực sự được sao chép nếu/khi chúng bị đột biến?

  • Có sự khác biệt đáng kể giữa chuỗi và chuỗi hoặc câu trả lời cho các câu hỏi trên có thể áp dụng đồng đều cho tất cả các chuỗi không?

  • Bất kỳ điều gì khác đáng chú ý chung?

Cảm ơn bạn!

+0

cho đầy đủ, cuộc sống định nghĩa chuỗi nim [trên github] (https: //github.com/Araq/Nim/blob/master/lib/system.nim#L56) có thể giúp giải thích lý do tại sao nó báo cáo nội dung báo cáo. –

+1

@ Mike'Pomax'Kamermans: Cảm ơn bạn đã liên kết, nhưng tôi không biết 'string * {.magic: String.}' Đang cố gắng nói cho tôi biết điều gì. ;-) –

+0

yeah, không quá chắc chắn bản thân mình, chỉ cần figured nó có thể là thông tin tốt để có trong câu hỏi như là một dẫn có thể cho mọi người tốt hơn tại khám phá những gì lên hơn chúng tôi =) –

Trả lời

10

Định nghĩa của chuỗi thực sự là trong system.nim, chỉ dưới một cái tên khác:

type 
    TGenericSeq {.compilerproc, pure, inheritable.} = object 
    len, reserved: int 
    PGenericSeq {.exportc.} = ptr TGenericSeq 
    UncheckedCharArray {.unchecked.} = array[0..ArrayDummySize, char] 
    # len and space without counting the terminating zero: 
    NimStringDesc {.compilerproc, final.} = object of TGenericSeq 
    data: UncheckedCharArray 
    NimString = ptr NimStringDesc 

Vì vậy, một chuỗi là một con trỏ liệu đến một đối tượng với một lĩnh vực len, reserveddata. Các procs cho chuỗi được định nghĩa trong sysstr.nim.

Ngữ nghĩa của phân công chuỗi đã được chọn giống như tất cả các loại giá trị (không phải ref hoặc ptr) trong Nim theo mặc định, vì vậy bạn có thể giả định rằng các bài tập tạo bản sao. Khi một bản sao là không cần thiết, trình biên dịch có thể bỏ nó ra, nhưng tôi không chắc chắn bao nhiêu điều đó đang xảy ra cho đến nay. Việc chuyển chuỗi vào một proc không sao chép chúng. Không có tối ưu hóa ngăn chặn các bản sao chuỗi cho đến khi chúng bị đột biến. Chuỗi hoạt động theo cùng một cách.

Bạn có thể thay đổi hành vi phân công mặc định của chuỗi và seqs bằng cách đánh dấu chúng như cạn, sau đó không có bản sao được thực hiện trên công việc:

var s = "foo" 
shallow s 
+0

Cảm ơn def-. Điều đó rất hữu ích và có vẻ như 'nông cạn' sẽ hữu ích. –

+2

ngoài '' cạn'' cho phép hành vi "sao chép dưới dạng con trỏ" cho tất cả các bản sao trong tương lai, cũng có một thao tác '' shallowCopy'' chỉ có thể được sử dụng ở những vị trí cụ thể. Dưới mui xe, đốt được quản lý theo cách này sẽ chia sẻ cùng một phân bổ bộ nhớ được tính lại. – zah

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