Mục đích của Unions trong C và C ++

Mục đích của các công đoàn là khá rõ ràng, nhưng vì một số lý do mà mọi người thường bỏ lỡ nó khá thường xuyên.

Mục đích của union là tiết kiệm bộ nhớ bằng cách sử dụng cùng một vùng bộ nhớ để lưu trữ các đối tượng khác nhau tại các thời điểm khác nhau. Đó là nó.

Nó giống như một căn phòng trong khách sạn. Những người khác nhau sống trong đó trong những khoảng thời gian không trùng lặp. Những người này không bao giờ gặp nhau, và nói chung là không biết gì về nhau. Bằng cách quản lý hợp lý việc chia sẻ thời gian của các phòng (tức là bằng cách đảm bảo rằng những người khác nhau không được phân vào một phòng cùng một lúc), một khách sạn tương đối nhỏ có thể cung cấp chỗ ở cho một số lượng tương đối lớn, đó là điều mà các khách sạn là cho.

Đó chính xác là những gì công đoàn làm. Nếu bạn biết rằng một số đối tượng trong chương trình của mình giữ các giá trị có thời gian tồn tại giá trị không chồng chéo, thì bạn có thể “hợp nhất” các đối tượng này thành một liên hợp và do đó tiết kiệm bộ nhớ. Giống như một phòng khách sạn có nhiều nhất một người thuê “hoạt động” tại mỗi thời điểm, một công đoàn có nhiều nhất một thành viên “tích cực” tại mỗi thời điểm của chương trình. Chỉ thành viên “đang hoạt động” mới có thể được đọc. Bằng cách ghi vào thành viên khác, bạn chuyển trạng thái “hoạt động” cho thành viên khác đó.

Vì một lý do nào đó, mục đích ban đầu này của công đoàn đã bị “ghi đè” bằng một thứ hoàn toàn khác: viết một thành viên của một công đoàn và sau đó kiểm tra nó thông qua một thành viên khác. Kiểu diễn giải lại bộ nhớ này (hay còn gọi là “kiểu lắt léo”) không phải là cách sử dụng hợp lệ của các hợp nhất. Nói chung, nó dẫn đến hành vi không xác định được mô tả là tạo ra hành vi được xác định bởi triển khai trong C89 / 90.

CHỈNH SỬA: Việc sử dụng kết hợp cho mục đích đánh lừa kiểu (tức là viết một thành viên và sau đó đọc thành viên khác) đã được đưa ra định nghĩa chi tiết hơn trong một trong các Viện Kỹ thuật theo tiêu chuẩn C99 (xem DR # 257 và DR # 283 ). Tuy nhiên, hãy nhớ rằng về mặt hình thức, điều này không bảo vệ bạn khỏi hành vi không xác định bằng cách cố gắng đọc biểu diễn bẫy.