การเขียนโปรแกรม D - สหภาพแรงงาน
ก unionเป็นชนิดข้อมูลพิเศษที่มีอยู่ใน D ที่ช่วยให้คุณสามารถจัดเก็บข้อมูลประเภทต่างๆในตำแหน่งหน่วยความจำเดียวกัน คุณสามารถกำหนดสหภาพที่มีสมาชิกหลายคน แต่มีสมาชิกเพียงคนเดียวเท่านั้นที่สามารถมีค่าในช่วงเวลาใดก็ได้ สหภาพแรงงานเป็นวิธีที่มีประสิทธิภาพในการใช้ตำแหน่งหน่วยความจำเดียวกันเพื่อวัตถุประสงค์หลายประการ
การกำหนดสหภาพใน D.
ในการกำหนดสหภาพคุณต้องใช้คำสั่งสหภาพในลักษณะเดียวกันกับที่คุณทำในขณะที่กำหนดโครงสร้าง คำสั่งสหภาพกำหนดชนิดข้อมูลใหม่โดยมีสมาชิกมากกว่าหนึ่งคนสำหรับโปรแกรมของคุณ รูปแบบของแถลงการณ์สหภาพมีดังนี้ -
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
union tagเป็นทางเลือกและนิยามสมาชิกแต่ละตัวเป็นนิยามตัวแปรปกติเช่น int i; หรือลอยฉ; หรือนิยามตัวแปรอื่น ๆ ที่ถูกต้อง ในตอนท้ายของนิยามของสหภาพก่อนเครื่องหมายอัฒภาคสุดท้ายคุณสามารถระบุตัวแปรยูเนี่ยนได้ตั้งแต่หนึ่งตัวแปรขึ้นไป นี่คือวิธีที่คุณจะกำหนดประเภทสหภาพที่ชื่อ Data ซึ่งมีสมาชิกสามคนi, fและ str -
union Data {
int i;
float f;
char str[20];
} data;
ตัวแปรของ Datatype สามารถจัดเก็บจำนวนเต็มตัวเลขทศนิยมหรือสตริงของอักขระ ซึ่งหมายความว่าตัวแปรเดียว (ตำแหน่งหน่วยความจำเดียวกัน) สามารถใช้เพื่อจัดเก็บข้อมูลหลายประเภทได้ คุณสามารถใช้ชนิดข้อมูลในตัวหรือที่ผู้ใช้กำหนดภายในสหภาพตามความต้องการของคุณ
หน่วยความจำที่สหภาพแรงงานครอบครองจะมีขนาดใหญ่พอที่จะรองรับสมาชิกที่ใหญ่ที่สุดของสหภาพได้ ตัวอย่างเช่นในตัวอย่างข้างต้นชนิดข้อมูลจะใช้พื้นที่หน่วยความจำ 20 ไบต์เนื่องจากเป็นพื้นที่สูงสุดที่สตริงอักขระสามารถครอบครองได้ ตัวอย่างต่อไปนี้แสดงขนาดหน่วยความจำทั้งหมดที่ครอบครองโดยสหภาพข้างต้น -
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;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Memory size occupied by data : 20
การเข้าถึงสมาชิกสหภาพ
ในการเข้าถึงสมาชิกของสหภาพใด ๆ เราใช้ไฟล์ member access operator (.). ตัวดำเนินการเข้าถึงสมาชิกถูกเข้ารหัสเป็นช่วงเวลาระหว่างชื่อตัวแปรสหภาพและสมาชิกสหภาพที่เราต้องการเข้าถึง คุณจะใช้คีย์เวิร์ดยูเนี่ยนเพื่อกำหนดตัวแปรประเภทยูเนี่ยน
ตัวอย่าง
ตัวอย่างต่อไปนี้อธิบายการใช้สหภาพ -
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);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
size of : 16
data.i : 1917853764
data.f : 4.12236e+30
data.str : D Programming
ที่นี่คุณจะเห็นค่าของ i และ f สมาชิกของสหภาพได้รับความเสียหายเนื่องจากค่าสุดท้ายที่กำหนดให้กับตัวแปรได้ครอบครองตำแหน่งหน่วยความจำและนี่คือเหตุผลที่ค่าของ str สมาชิกได้รับการพิมพ์เป็นอย่างดี
ตอนนี้ให้เราดูตัวอย่างเดียวกันอีกครั้งโดยที่เราจะใช้ตัวแปรทีละตัวซึ่งเป็นจุดประสงค์หลักของการมีสหภาพ -
ตัวอย่างที่แก้ไข
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);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
size of : 16
data.i : 10
data.f : 220.5
data.str : D Programming
ที่นี่สมาชิกทุกคนได้รับการพิมพ์เป็นอย่างดีเนื่องจากมีการใช้สมาชิกครั้งละหนึ่งคน