2010-11-22 40 views
9

thể trùng lặp:
c difference between malloc and callocthích malloc qua calloc

Có bất kỳ tình huống mà bạn muốn malloc qua calloc. tôi biết cả hai malloc và calloc phân bổ bộ nhớ động và calloc đó cũng khởi tạo tất cả các bit trong bộ nhớ được phân bổ bằng không. Từ này tôi sẽ đoán nó luôn luôn tốt hơn để sử dụng calloc trên malloc. Hoặc là có một số tình huống mà malloc là tốt hơn? Hiệu suất có thể là gì?

+0

Bỏ phiếu để mở lại ứng dụng này. Câu hỏi khác là về sự khác biệt. Câu hỏi này khác. Nó hỏi tại sao người ta thích malloc (đó là một thực tế phổ biến). –

+0

@RaymondHettinger, nếu tôi nhớ chính xác, điều đó không quan trọng nếu các câu trả lời của họ giống nhau. –

Trả lời

19

Nếu bạn cần bộ nhớ được cấp phát động để không được khởi tạo thì sử dụng calloc.

Nếu bạn không cần bộ nhớ được cấp phát động để không được khởi tạo, sau đó sử dụng malloc.

Bạn không phải lúc nào cũng cần bộ nhớ không khởi tạo; nếu bạn không cần bộ nhớ zero-initialized, không phải trả chi phí khởi tạo nó. Ví dụ, nếu bạn cấp phát bộ nhớ và sau đó ngay lập tức sao chép dữ liệu để lấp đầy bộ nhớ được cấp phát, không có lý do gì để thực hiện zero-initialization.

callocmalloc là các chức năng làm những việc khác nhau: sử dụng cái nào phù hợp nhất cho tác vụ bạn cần thực hiện.

+0

Thanks.performance là một điểm tốt. Tôi cũng thích biết nếu có bất kỳ lý do nào khác có thể. – user514946

+1

(Ugh ... họ đã đóng câu hỏi của bạn, hơi khác một chút so với "trùng lặp" ... thỉnh thoảng tôi ghét S.O.) Dù sao, có nhiều lý do bạn có thể muốn sử dụng calloc trên malloc. Một là các chương trình như valgrind sẽ phát hành nhiều cảnh báo có khả năng giả mạo với malloc. Loại khác có liên quan đến việc phát hiện lỗi. Sử dụng bộ nhớ uninitialized có thể dẫn đến hành vi thất thường mà có thể làm cho bạn nhận thấy một lỗi mà có thể nếu không đi không được chú ý nếu bạn sử dụng calloc. –

2

Dựa vào số không khởi tạo của calloc có thể nguy hiểm nếu bạn không cẩn thận. Bộ nhớ zeroing cho 0 đối với các kiểu tích phân và \ 0 cho các kiểu char như mong đợi. Nhưng nó không nhất thiết phải tương ứng với float/double 0 hoặc NULL con trỏ.

0

Bạn thường phân bổ bộ nhớ với mục đích cụ thể là lưu trữ thứ gì đó ở đó. Điều đó có nghĩa là (ít nhất là hầu hết) không gian được zero-initialized bởi calloc sẽ sớm được ghi đè bằng các giá trị khác. Như vậy, hầu hết các mã sử dụng malloc cho một chút tốc độ thêm mà không mất thực sự.

Gần như chỉ sử dụng tôi đã thấy cho calloc là mã được (được cho là) ​​đo điểm chuẩn tốc độ của Java so với C++. Trong phiên bản C++, nó phân bổ một số bộ nhớ với calloc, sau đó sử dụng memset để khởi tạo lại bộ nhớ trong (có vẻ như với tôi) một nỗ lực khá minh bạch trong việc tạo ra các kết quả có lợi cho Java.