Về cơ bản, trong các ngôn ngữ chưa được đánh dấu, mọi điểm tham chiếu đến một đối tượng có chứa cả loại và giá trị. Ví dụ: var a = 3
trỏ đến một thể hiện chứa giá trị 3 và kiểu int, nếu bạn tạo a = "bla"
, tham chiếu được cập nhật thành một thể hiện chứa chuỗi "bla" và chuỗi kiểu, đối tượng cũ bị loại bỏ, v.v ...
Điều này chậm vì mỗi khi một thao tác (ví dụ a + b
) phải được thực hiện trên các loại cơ bản này, trước tiên thời gian chạy phải hủy đăng ký các đối tượng, kiểm tra xem loại của chúng có tương thích không, thực hiện thao tác, tạo đối tượng mới.
Ngược lại, a + b
trong C ++ hoặc Java kiểm tra tại thời điểm biên dịch rằng các loại là hợp lệ và tương thích, thì a và b được lưu trữ dưới dạng giá trị ngay lập tức (không phải tham chiếu) và bổ sung là thao tác xử lý đơn giản trên các giá trị này.
Tất nhiên, đây là tất cả rất lý thuyết. Trong thực tế, rất nhiều tối ưu hóa có thể được thực hiện trong quá trình này để tránh phần lớn chi phí và các ngôn ngữ được gõ động có thể nhận được khá nhanh.