Lập trình 04/11/2026 7 phút

Rust đo thật — bố cục bộ nhớ: trình biên dịch tự sắp lại trường để struct 15 byte dữ liệu chỉ tốn 16 byte thay vì 32 như repr(C), Option<&T> vẫn đúng 8 byte nhờ tối ưu niche, còn kiểu kích thước 0 không chiếm byte nào

Phần 3 sê-ri Rust đo thật: đo bằng size_of và align_of trong container rust 1.99.1 cách Rust xếp dữ liệu. Một struct chứa 15 byte dữ liệu thật nhưng xen kẽ u8/u64/u32: repr Rust mặc định thì trình biên dịch TỰ sắp lại trường, gói còn 16 byte; ép repr(C) giữ nguyên thứ tự khai báo thì phình lên 32 byte vì padding. Tối ưu niche: Option<&T> và Option<Box<T>> vẫn đúng 8 byte (dùng null làm None), Option<bool>=1, nhưng Option<u64>=16 vì u64 dùng hết mọi bit. Enum = biến thể lớn nhất cộng cờ phân biệt (24 byte). Kiểu kích thước 0 như () tốn 0 byte, Vec<()> không cấp phát heap.

Lập trình 03/11/2026 8 phút

Rust đo thật — borrow checker: mượn chia sẻ thì bất biến, &mut thì độc quyền; sửa vec khi đang duyệt hay cho &mut đụng một & đang sống đều là lỗi biên dịch E0502/E0499, còn trả tham chiếu tới biến cục bộ bị chặn ngay bằng E0515

Phần 2 sê-ri Rust đo thật: ta cần cho mượn giá trị mà không trao quyền sở hữu, và borrow checker áp đúng một luật — aliasing XOR mutability: nhiều tham chiếu chia sẻ & cùng lúc thì được, nhưng chỉ cần một &mut thì nó phải độc quyền. Đo trong container rust 1.99.1 bằng chính các lỗi biên dịch: &mut v khi một &v đang còn dùng cho E0502, hai &mut cùng lúc cho E0499, sửa vec giữa vòng for cho E0502 (chặn iterator invalidation — bug kinh điển của C++), trả tham chiếu tới biến cục bộ bị chặn bằng E0515. Nhờ non-lexical lifetime, push sau khi tham chiếu hết dùng vẫn biên dịch.

Lập trình 02/11/2026 8 phút

Rust đo thật — ownership và move: vì sao không cần bộ gom rác; dùng lại giá trị sau khi move là lỗi BIÊN DỊCH E0382, còn drop chạy xác định theo thứ tự ngược khai báo, quyết tại lúc biên dịch chứ không phải lúc chạy

Bài mở đầu sê-ri Rust đo thật: ownership là quy tắc mỗi giá trị có đúng một chủ, và khi hết phạm vi của chủ thì giá trị bị dọn ngay — không cần bộ gom rác, không cần free thủ công. Đo trong container rust 1.99.1: gán String cho biến khác là MOVE, dùng lại biến cũ cho ra lỗi biên dịch E0382 (chương trình không chạy nổi), move chỉ sao chép 3 word trên stack nên con trỏ heap giữ nguyên địa chỉ (0xaaaa...7d60 trước và sau), i32 là Copy nên vẫn dùng được cả hai, và hàm drop chạy đúng thứ tự ngược khai báo ngay tại cuối phạm vi — toàn bộ quyết định tại lúc biên dịch.