2015-09-11 17 views
6

Tôi đang học các Công cụ vì vậy tôi đã tạo một ứng dụng đơn giản cho phép người dùng nhập một số Mega Bytes (MB) được phân bổ. Và tôi sử dụng công cụ "Phân bổ" trong Công cụ để đảm bảo lượng dữ liệu chính xác này được phân bổ. Tuy nhiên, tôi luôn thấy nhiều bộ nhớ hơn được phân bổ trong các công cụ hơn tôi mong đợi.phân bổ số lượng bộ nhớ cụ thể nhanh chóng - iOS

tôi đã làm như sau

func allocateMemoryOfSize(numberOfBytes: Int) { 

    var bytesArray = [Int8]() 
    for i in 0 ..< numberOfBytes { 
     bytesArray.append(Int8(i % 7)) 
    } 
} 

tôi đã kiểm tra rất nhiều câu hỏi và tôi thấy một sự thay thế sử dụng:

func allocateMemoryOfSize(numberOfBytes: Int) { 
     var imageData = UnsafeMutablePointer<Int8>.alloc(numberOfBytes)} 

Nhưng tôi vẫn nhận thêm bộ nhớ được phân bổ. Đây là restults trong Instruments khi tôi phân bổ 10 MBS:

Trước khi chạy chức năng allocateMemoryOfSize:

Before: only 20.58 MB used

Trong các hoạt động của các chức năng: 44,96 MB sử dụng During: 44.96 MB used

Sau khi chạy của hàm: quay lại chỉ 20.58 MB After: back to only 20.58 MB

Vì vậy, chức năng phân bổ es khoảng 22 MBs không 10 như muốn. Tôi đang làm gì sai? hoặc là công cụ quản lý bộ nhớ bổ sung này?

Trả lời

6

Trong trường hợp đầu tiên khi bạn chắp thêm byte vào mảng của bạn trong nội bộ, nó sử dụng phân bổ lại khi không có dung lượng trống. Sự tái phân bổ này thường tăng gấp đôi kích thước mảng hiện tại. Sau đây là cách nó trông giống:

enter image description here

Bạn thấy rằng phân bổ được thực hiện với một số không gian bổ sung.

Nếu chúng ta thay đổi bạn chức năng để preallocate bộ nhớ:

func allocateMemoryOfSize(numberOfBytes: Int) { 
    buffer = [UInt8](count: numberOfBytes, repeatedValue: 0) 
    for i in 0 ..< numberOfBytes { 
     buffer[i] = UInt8(i % 7) 
    } 
} 

Chúng ta sẽ thấy điều này:

enter image description here

Update # 1

Allocation với con trỏ không an toàn sẽ làm việc quá. Bất lợi chính là quản lý bộ nhớ thủ công: bạn phải deallocate nó một cách rõ ràng.

Giới thiệu tóm tắt phân bổ: khi bạn cấp phát bộ nhớ, một số phân bổ hệ thống cũng sẽ xảy ra. Trong ảnh chụp màn hình của tôi, bạn có thể thấy rằng không chỉ 10 megabyte được phân bổ với người gọi swift.slowAlloc mà còn 8 megabyte với người gọi _dispatch_alloc_try_create_heap. Vì vậy, bạn sẽ thấy trên biểu đồ mà ứng dụng sử dụng 18 megabyte thay vì 10. Tôi không biết tại sao phân bổ hệ thống này cũng xảy ra bởi vì nó là iOS internals. Tôi nghĩ rằng bạn cần phải chú ý chỉ trên phân bổ của bạn. Trong ví dụ của tôi, tôi thấy rằng 10 megabyte được yêu cầu và được cung cấp cho ứng dụng.

+0

Cảm ơn rất nhiều, John! Tôi chỉ có vài ý kiến: 1 - nó làm việc khi tôi loại bỏ vòng lặp for khi tôi nhập 10MB, nó được phân bổ chính xác 10 MB. Với vòng lặp for, nó phân bổ khoảng 15MB. Có lẽ vòng lặp cần một số bộ nhớ quá. Vì vậy, tôi đề nghị bạn loại bỏ vòng lặp for từ câu trả lời của bạn. 2 - Tôi hiểu lời giải thích của bạn cho việc phân bổ mảng, nhưng tại sao cuộc gọi mảng có thể thay đổi không an toàn được cấp phát bộ nhớ nhiều hơn? Cảm ơn rất nhiều! – CSawy

+0

Tôi nghĩ rằng đối với vòng lặp không ảnh hưởng đến phân bổ. Tôi đã cập nhật câu trả lời của mình với một số giải thích về tóm tắt phân bổ. –

0

Tôi đã làm điều này:

static var buffer = [UInt8]() 
static func allocateMemoryOfSize(numberOfMegaBytes: Int) { 
    print("Allocating \(numberOfMegaBytes)MB of memory") 
    let mb = 1048576 
    let newBuffer = [UInt8](count: numberOfMegaBytes * mb, repeatedValue: 0) 
    buffer += newBuffer 
} 
+0

Không thể không suy nghĩ về việc tôi yêu pascal bao nhiêu: var Dữ liệu: PByte; Dữ liệu: = AllocMem (SomeByteSize); ZeroMemory (Dữ liệu, SomeByteSize); :) –

0

Swift 3.1:

static var buffer = [UInt8]() 

static func allocateMemoryOfSize(numberOfMegaBytes: Int) { 
    print("Allocating \(numberOfMegaBytes)MB of memory") 
    let mb = 1048576 
    let newBuffer = [UInt8](repeating: 0, count: numberOfMegaBytes * mb) 
    buffer += newBuffer 
} 
Các vấn đề liên quan