Rust Trait Object hoạt động thế nào bên dưới bộ nhớ

Rust Trait Object hoạt động thế nào bên dưới bộ nhớ

Một bài mổ xẻ bộ nhớ mới đây cho thấy cách Rust xử lý dynamic trait không đơn thuần là C++ thay áo mới.

Lập trình viên Sofia Belén vừa soi vào bên trong Rust để xem virtual dispatch được sắp xếp thế nào trong bộ nhớ. Khi mổ xẻ các struct đơn giản, cô phát hiện một chi tiết thú vị: các zero-sized type (ZST) đúng nghĩa tốn tròn 0 byte bộ nhớ. Khác với C++ luôn ép object rỗng tốn ít nhất 1 byte để có địa chỉ định danh, Rust kiểm soát định danh object qua borrow checker ngay từ lúc compile. Chỉ trong các bản debug build, Rust mới tạm gán 1 byte ảo trên stack để công cụ debugger dễ kiểm tra.

Tại sao việc này quan trọng: Nhìn vào sơ đồ bộ nhớ thực tế giúp khái niệm "zero-cost abstraction" của Rust trở nên rõ ràng chứ không còn mông lung. Nhờ xử lý định danh object lúc compile thay vì dựa vào địa chỉ byte, Rust bỏ hoàn toàn phần chi phí bộ nhớ thừa mà C++ phải gánh suốt nhiều thập kỷ.

Nói ngắn gọn: nếu học Rust bằng cách soi chiếu 1:1 từ C++, bạn sẽ bỏ lỡ chính những tư duy thiết kế tạo nên sự khác biệt của ngôn ngữ này.

Hóa ra so sánh Rust với C++ là một cái bẫy — nhưng là một cái bẫy học được rất nhiều điều.