การเขียนโปรแกรม 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

ที่นี่สมาชิกทุกคนได้รับการพิมพ์เป็นอย่างดีเนื่องจากมีการใช้สมาชิกครั้งละหนึ่งคน