2016-11-19 35 views
8

數據/ NSData字節是否保證存儲在連續的內存中?查看文檔(https://developer.apple.com/reference/foundation/data),我的印象是可以使用withUnsafeBytes()withUnsafeMutableBytes()訪問字節的連續表示。但是,在調用這些方法時,可能會將字節從非連續存儲器複製到連續塊。NSData/Data存儲是否連續?

我認爲這將是有點低效通過這些withUnsafe...方式訪問他們的時候複製字節,並且使用init(bytesNoCopy: ...)初始化時字節顯然連續存儲,所以我傾向於認爲,他們總是連續存儲,但還沒有看到任何明確說明的文檔。

+0

請親自看看:https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/Data.swift – Alexander

+0

感謝Alexander,感謝源代碼鏈接。查看代碼是一種很好的教育體驗,我在'enumerateBytes()'註釋中發現了一個聲明,即存儲不保證是連續的,然後由@Rob確認。 – OmniProg

回答

6

不,數據不保證存儲在連續的內存中。但是,如果使用withUnsafeByteswithUnsafeMutableBytes,則會將其複製到將具有單個連續塊中的數據的位置。如果您不希望產生這種開銷,最好調用enumerateBytes,如果數據當前不是連續的,將會爲每個單獨的內存塊調用閉包,從而避免複製完整的數據到一個新的連續塊。

+0

如果'withUnsafeBytes'產生了一個連續的副本,那麼爲什麼使用傳遞給它的閉包之外的指針是不安全的?在我看來,如果任何副本在調用之後要被回收,它應該是不連續的副本 – Andreas

+0

因爲在完成關閉之後,可以釋放並重新使用該連續緩衝區。它們只能保證該緩衝區的完整性,直到您從該關閉返回爲止。 – Rob

+0

爲什麼會與原始文件相連接?特別是因爲如果函數被調用一次,函數在將來被再次調用的概率要高得多。 – Andreas

1

withUnsafeBytes的存在是記錄他們保留不連續存儲字節的權利的一種方式,但可以按需提供。

這可能是因爲他們認爲NSData將移植到內存受限的環境,他們不希望你有系統相關的代碼。

相關問題