0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Khám Phá Khái Niệm Ownership: Tại Sao Nó Quan Trọng Trong Rust?

Đăng vào 1 tháng trước

• 4 phút đọc

Mở đầu

Chào mừng các bạn đến với bài viết về Rust! Trong bài trước, chúng ta đã cùng khám phá khái niệm về Biến và Tính khả năng thay đổi trong Rust. Hôm nay, chúng ta sẽ cùng nhau tìm hiểu về một trong những khái niệm quan trọng nhất trong Rust: Ownership. Đừng lo lắng nếu bạn cảm thấy khó hiểu - tôi sẽ cố gắng giải thích một cách dễ hiểu nhất có thể, và khi bạn hiểu, bạn sẽ thấy nó rất thú vị!

Stack và Heap Là Gì?

Nếu bạn học nhiều ngôn ngữ lập trình khác, có thể bạn không cần quan tâm nhiều đến StackHeap. Nhưng với Rust - một ngôn ngữ lập trình hệ thống, việc hiểu sự khác biệt giữa dữ liệu lưu trữ trên StackHeap là rất quan trọng trước khi tìm hiểu về Ownership.

Stack Là Gì?

Stack là một vùng nhớ có cấu trúc, hoạt động theo nguyên tắc Last In, First Out (LIFO) - giống như xếp chồng đĩa: đĩa cuối cùng được xếp vào sẽ được lấy ra đầu tiên.

Đặc điểm của Stack trong Rust:

  1. Kích thước cố định: Dữ liệu lưu trên Stack phải có kích thước biết trước và không thay đổi trong suốt thời gian tồn tại.
  2. Truy cập siêu nhanh:Stack quản lý dữ liệu theo thứ tự LIFO, Rust biết chính xác vị trí của từng biến.
  3. Giải phóng tự động: Khi biến ra khỏi phạm vi, Rust tự động giải phóng bộ nhớ.

Heap Là Gì?

Heap là một vùng nhớ linh hoạt, dùng để lưu trữ dữ liệu có kích thước không cố định hoặc có thể thay đổi trong runtime.

Đặc điểm của Heap trong Rust:

  1. Size động: Dữ liệu trên Heap có thể tăng hoặc giảm kích thước.
  2. Truy cập chậm hơn: Rust cần phải tìm vùng nhớ đủ lớn để lưu trữ dữ liệu.
  3. Quản lý bộ nhớ cần thiết: Nếu không giải phóng bộ nhớ Heap sau khi sử dụng, sẽ dẫn đến memory leak.

So Sánh Stack và Heap

Đặc Điểm Stack Heap
Tốc độ Siêu nhanh 🚀 Chậm hơn 🐢
Kích thước Cố định và biết trước Linh hoạt, có thể thay đổi
Quản lý bộ nhớ Tự động giải phóng Cần quản lý (Rust tự động làm)
Dữ liệu phù hợp Kiểu nguyên thủy (int, bool, ...) Kiểu phức tạp (String, Vector, ...)
Ví dụ let x = 5; let s = String::from("hello");

Ví Dụ Thực Tế: Stack và Heap

Stack giống như: Bạn đặt một đống sách lên bàn. Bạn biết quyển nào ở trên cùng và có thể lấy nó nhanh chóng.
Heap giống như: Bạn là nhân viên trong nhà hàng, sắp xếp khách hàng vào bàn trống phù hợp với số người. Nếu số lượng khách thay đổi, bạn cần tìm một bàn mới và di chuyển khách.

Ownership

Ownership là bộ 3 quy tắc giúp Rust quản lý bộ nhớ an toàn. Đây có thể là khái niệm mới lạ với nhiều lập trình viên, nhưng nó rất quan trọng.

Các Quy Tắc Ownership

  1. Quy tắc 1: Mỗi giá trị chỉ có 1 owner:
    Mỗi giá trị khởi tạo chỉ thuộc về một biến duy nhất.
  2. Quy tắc 2: Chỉ có một owner tại một thời điểm:
    Khi bạn gán một biến cho một biến khác, quyền sở hữu được chuyển giao.
  3. Quy tắc 3: Giá trị sẽ bị giải phóng khi owner ra khỏi scope:
    Khi biến ra khỏi phạm vi, Rust gọi hàm drop() để giải phóng bộ nhớ.

Nếu bạn vẫn cảm thấy khó hiểu về các quy tắc này, chúng ta hãy cùng tìm hiểu qua các ví dụ dưới đây.

Variables và Data Interacting với Move

Dữ liệu trên Stack: Copy
Dữ liệu nguyên thủy như bool, char, int... được lưu trên Stack và kích thước của chúng đã biết trước, vì vậy có thể thực hiện việc copy dễ dàng.

Dữ liệu trên Heap: Move
Với các kiểu dữ liệu phức tạp như String hay Vector, khi gán một biến mới, quyền sở hữu được chuyển giao. Điều này giúp tránh lưu trữ không cần thiết và bảo vệ bộ nhớ.

Ownership với Functions

Khi truyền tham số vào hàm, quyền sở hữu có thể được chuyển giao. Điều này có nghĩa là sau khi hàm kết thúc, biến sẽ không còn hợp lệ bên ngoài hàm.

Trả Về Giá Trị và Chuyển Quyền Sở Hữu

Hàm có thể trả về quyền sở hữu của một giá trị, cho phép sử dụng lại biến sau khi hàm kết thúc.

Kết Luận

Ownership như là hệ thống luật giao thông của Rust: rất nghiêm ngặt nhưng giúp bạn tránh tai nạn về bộ nhớ. Ban đầu có thể khó chịu, nhưng khi quen rồi, bạn sẽ thấy rất thú vị. Hy vọng rằng bài viết này sẽ giúp bạn hiểu rõ hơn về khái niệm Ownership - một tính năng cực kỳ quan trọng trong Rust. Nếu có thắc mắc, đừng ngần ngại để lại câu hỏi bên dưới nhé! Hãy thực hành với vài ví dụ, đừng sợ lỗi - Rust sẽ luôn hướng dẫn bạn cách sửa! Happy Rustaceans!

Tài Liệu Tham Khảo

Rust Doc.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào