12

Tôi đang viết một mã mới trong Fortran và do dự giữa việc sử dụng các mảng phân bổ hoặc mảng con trỏ. Tôi đọc ở đâu đó rằng mảng allocatable có lợi thế đáng kể so với các mảng con trỏ:Mảng ALLOCATABLE hoặc mảng POINTER?

1) hiệu quả hơn bởi vì họ luôn luôn kề nhau trong bộ nhớ

2) Không rò rỉ bộ nhớ là có thể

Có thể ai đó khẳng định điều này? Bạn sẽ khuyên dùng cái nào? Kết quả về tốc độ thực thi mã giữa hai phương án này là gì?

+0

Tại sao bạn không thể rò rỉ bộ nhớ? Bạn không phải 'DEALLOCATE' bất kỳ mảng nào bạn đã thực hiện với' allocatable'? –

+0

@Carl - ý của bạn là "phân bổ" ... – Rook

Trả lời

20

Các mảng có thể phân bổ có thể dẫn đến mã hiệu quả hơn vì các mảng sẽ tiếp giáp nhau. Đặc biệt nếu mảng được truyền cho một chương trình con, tiếp giáp có thể ngăn chặn sự cần thiết của trình biên dịch tạo ra một bản sao tạm thời.

Đối với các biến cục bộ trong chương trình con (không có thuộc tính SAVE) (đối với Fortran 95 và cao hơn), mảng phân bổ sẽ tự động được phân bổ khi thoát khỏi chương trình con, tránh rò rỉ bộ nhớ. Rò rỉ bộ nhớ là không thể với allocatables, ngoại trừ trong ý nghĩa của lập trình viên không deallocating một mảng mà không còn cần.

Với con trỏ, bạn có thể gán lại con trỏ, để lại một số bộ nhớ không thể truy cập và bị mất - một dạng rò rỉ. Nếu một phân bổ sẽ thực hiện công việc, tôi khuyên bạn nên sử dụng phương thức đó thay vì một con trỏ.

Một số lý do để sử dụng con trỏ: lấy một phần của mảng hoặc tạo cấu trúc dữ liệu chẳng hạn như danh sách được liên kết. Với mục đích tạo ra một mảng kích thước được xác định tại thời gian chạy, tôi sẽ sử dụng một allocatable.

+0

Cảm ơn bạn rất nhiều vì lời giải thích rất rõ ràng này! Cập nhật – remek

+2

: với Fortran 2008, bạn có thể tạo danh sách được liên kết bằng các biến có thể phân bổ thay vì con trỏ. Xem mục 5.3 của ftp://ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdf –

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