2015-09-21 16 views
7

Tôi đã theo ấn tượng rằng alloc trong Objective-C (khi chúng ta gọi [anyObject alloc] được thực sự thực hiện chức năng C malloc và bộ nhớ bị phân bổ trong đống, nhưng không thể tìm thấy bất cứ nơi nào câu trả lời cho việc này.phân bổ, malloc và alloca - Sự khác biệt là gì?

Ngoài ra, trong khi tìm kiếm cho alloc, tôi thấy alloca đó cấp phát bộ nhớ trong stack. Nếu tôi không sai, alloc cấp phát bộ nhớ trong heap để tạo các đối tượng.

vì vậy, sự khác biệt giữa allocmalloc (và alloca) là gì? ai có thể vui lòng tóm tắt ?

Trả lời

15

alloc() không phải là chức năng thư viện C chuẩn. Một số trình biên dịch và thư viện cũ hơn chứa một thư viện <alloc.h> cung cấp một số chức năng phân bổ bộ nhớ, nhưng đây không phải là tiêu chuẩn. Thời gian chạy Microsoft Visual C++ bao gồm một hàm Alloc() tương tự như malloc(), nhưng đây cũng không phải là một phần của tiêu chuẩn C.

malloc() cấp phát bộ nhớ trên quy trình xử lý. Bộ nhớ được cấp phát sử dụng malloc() sẽ vẫn còn trên heap cho đến khi nó được giải phóng bằng cách sử dụng free().

alloca() cấp phát bộ nhớ trong khung ngăn xếp của chức năng hiện tại. Bộ nhớ được cấp phát sử dụng alloca() sẽ bị xóa khỏi ngăn xếp khi hàm hiện tại trả về. alloca() được giới hạn trong phân bổ nhỏ.

Các trường hợp trong đó alloca() phù hợp là rất hiếm. Trong hầu hết các trường hợp, bạn nên sử dụng malloc() để cấp phát bộ nhớ.

+2

"Các tình huống nơi alloca() phù hợp là rất hiếm. Trong hầu hết mọi trường hợp, bạn nên sử dụng malloc() để cấp phát bộ nhớ." Không. Tất cả 'alloca()' đều cung cấp các mảng chiều dài biến đổi. Không có sự khác biệt thực tế giữa 'int n = 6; double x [n]; 'và' int n = 6; double * x = alloca (n * sizeof (* x)); 'Không chỉ vậy, việc sử dụng' malloc() 'trong các chương trình đa luồng có thể là một nút cổ chai hiệu suất nghiêm trọng. –

+0

Truy vấn của tôi đã được nhiều hơn về mục tiêu-C mà thực hiện '[[someObject alloc] init]' để cấp phát bộ nhớ và khởi tạo đối tượng trong heap. Liệu '[someObject alloc]' có triển khai 'malloc' trong nền? –

+6

@AndrewHenle Tôi đã không nói rằng có * không * tình huống mà 'alloca()' là thích hợp; Tôi nói rằng họ rất hiếm. VLAs là một trong những trường hợp chúng hữu ích, nhưng thậm chí ở đó chúng chủ yếu là một tối ưu hóa. Vì OP rõ ràng là mới đối với lập trình C, nên tôi đã chọn không đi sâu vào chi tiết. :) – duskwuff

0

Chức năng alloc được sử dụng để phân bổ một vùng hoặc khối byte có kích thước theo chiều dài heap.

Chức năng malloc được sử dụng để phân bổ lưu trữ heap. Tên của nó là viết tắt của cấp phát bộ nhớ.

+0

Hãy xem [URL] này (http://stackoverflow.com/help) sẽ rất tiện lợi để nâng chất lượng của bạn lên –

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