Lý do đằng sau không lưu trữ rõ ràng độ dài của một mảng với một mảng là C
gì?
Theo cách tôi thấy, có rất nhiều lý do để làm như vậy nhưng không có nhiều sự hỗ trợ của tiêu chuẩn (C89). Ví dụ:
- Có chiều dài có sẵn trong một bộ đệm có thể ngăn chặn tràn bộ đệm.
- Kiểu Java
arr.length
vừa rõ ràng vừa giúp người lập trình không phải duy trì nhiềuint
s trên ngăn xếp nếu xử lý một số mảng - Các tham số chức năng trở nên hợp tác hơn.
Nhưng có lẽ lý do thúc đẩy nhất, theo tôi, là thông thường, không có không gian nào được lưu mà không giữ được chiều dài. Tôi muốn mạo hiểm nói rằng hầu hết việc sử dụng mảng liên quan đến phân bổ động. Đúng, có thể có một số trường hợp mọi người sử dụng một mảng được phân bổ trên ngăn xếp, nhưng đó chỉ là một hàm gọi * - ngăn xếp có thể xử lý thêm 4 hoặc 8 byte.
Vì trình quản lý heap phải theo dõi kích thước khối miễn phí được sử dụng bởi mảng được phân bổ động, tại sao không làm cho thông tin đó có thể sử dụng được (và thêm quy tắc bổ sung, được kiểm tra tại thời điểm biên dịch, rằng người ta không thể thao tác độ dài một cách rõ ràng trừ khi người ta sẽ thích tự bắn vào chân mình).
Điều duy nhất tôi có thể nghĩ đến ở phía bên kia là không theo dõi chiều dài có thể đã thực hiện các trình biên dịch đơn giản, nhưng không phải là đơn giản hơn nhiều.
* Về mặt kỹ thuật, người ta có thể viết một số loại hàm đệ quy với một mảng có lưu trữ tự động, và trong trường hợp (rất công phu) này lưu trữ độ dài thực sự có thể dẫn đến việc sử dụng không gian hiệu quả hơn.
malloc()
khu vực ed không thể được yêu cầu theo cách di động?" Đó là một điều khiến tôi tự hỏi nhiều lần.