Lập trình D - Liên hiệp
A unionlà một kiểu dữ liệu đặc biệt có sẵn trong D cho phép bạn lưu trữ các kiểu dữ liệu khác nhau trong cùng một vị trí bộ nhớ. Bạn có thể xác định một liên hợp với nhiều thành viên, nhưng chỉ một thành viên có thể chứa một giá trị tại bất kỳ thời điểm nào. Unions cung cấp một cách hiệu quả để sử dụng cùng một vị trí bộ nhớ cho nhiều mục đích.
Định nghĩa một Liên minh trong D
Để định nghĩa một union, bạn phải sử dụng câu lệnh union theo cách tương tự như khi xác định cấu trúc. Câu lệnh union xác định một kiểu dữ liệu mới, với nhiều hơn một thành viên cho chương trình của bạn. Định dạng của câu lệnh liên minh như sau:
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
Các union taglà tùy chọn và mỗi định nghĩa thành viên là một định nghĩa biến bình thường, chẳng hạn như int i; hoặc float f; hoặc bất kỳ định nghĩa biến hợp lệ nào khác. Ở cuối định nghĩa của union, trước dấu chấm phẩy cuối cùng, bạn có thể chỉ định một hoặc nhiều biến union nhưng nó là tùy chọn. Đây là cách bạn xác định một kiểu liên hợp có tên là Dữ liệu có ba thành viêni, fvà str -
union Data {
int i;
float f;
char str[20];
} data;
Một biến của Datakiểu có thể lưu trữ một số nguyên, một số dấu phẩy động hoặc một chuỗi ký tự. Điều này có nghĩa là một biến duy nhất (cùng một vị trí bộ nhớ) có thể được sử dụng để lưu trữ nhiều loại dữ liệu. Bạn có thể sử dụng bất kỳ kiểu dữ liệu tích hợp sẵn hoặc do người dùng xác định bên trong liên hợp dựa trên yêu cầu của bạn.
Bộ nhớ do một liên minh chiếm giữ sẽ đủ lớn để chứa thành viên lớn nhất của liên minh. Ví dụ, trong ví dụ trên, Kiểu dữ liệu sẽ chiếm 20 byte không gian bộ nhớ vì đây là không gian tối đa có thể bị chiếm bởi chuỗi ký tự. Ví dụ sau đây hiển thị tổng dung lượng bộ nhớ bị chiếm bởi liên hợp trên:
import std.stdio;
union Data {
int i;
float f;
char str[20];
};
int main( ) {
Data data;
writeln( "Memory size occupied by data : ", data.sizeof);
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Memory size occupied by data : 20
Tiếp cận các thành viên của Liên minh
Để tiếp cận bất kỳ thành viên nào của một công đoàn, chúng tôi sử dụng member access operator (.). Toán tử truy cập thành viên được mã hóa là khoảng thời gian giữa tên biến liên hợp và thành viên liên minh mà chúng ta muốn truy cập. Bạn sẽ sử dụng từ khóa union để xác định các biến của kiểu union.
Thí dụ
Ví dụ sau giải thích cách sử dụng union -
import std.stdio;
union Data {
int i;
float f;
char str[13];
};
void main( ) {
Data data;
data.i = 10;
data.f = 220.5;
data.str = "D Programming".dup;
writeln( "size of : ", data.sizeof);
writeln( "data.i : ", data.i);
writeln( "data.f : ", data.f);
writeln( "data.str : ", data.str);
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
size of : 16
data.i : 1917853764
data.f : 4.12236e+30
data.str : D Programming
Tại đây, bạn có thể thấy giá trị của i và f các thành viên của union bị hỏng vì giá trị cuối cùng được gán cho biến đã chiếm vị trí bộ nhớ và đây là lý do mà giá trị của str thành viên đang được in rất tốt.
Bây giờ chúng ta hãy xem xét cùng một ví dụ một lần nữa, nơi chúng ta sẽ sử dụng một biến tại một thời điểm, mục đích chính của việc kết hợp -
Ví dụ sửa đổi
import std.stdio;
union Data {
int i;
float f;
char str[13];
};
void main( ) {
Data data;
writeln( "size of : ", data.sizeof);
data.i = 10;
writeln( "data.i : ", data.i);
data.f = 220.5;
writeln( "data.f : ", data.f);
data.str = "D Programming".dup;
writeln( "data.str : ", data.str);
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
size of : 16
data.i : 10
data.f : 220.5
data.str : D Programming
Ở đây, tất cả các thành viên đang được in rất tốt vì một thành viên đang được sử dụng tại một thời điểm.