কাঠামো এবং ইউনিয়নের মধ্যে পার্থক্য


411

structএবং এ এর মধ্যে পার্থক্য দেওয়ার জন্য কোনও ভাল উদাহরণ আছে কি union? মূলত আমি জানি যে structএর সদস্যের সমস্ত স্মৃতি unionব্যবহার করে এবং বৃহত্তম সদস্যদের মেমরি স্পেস ব্যবহার করে। অন্য কোন ওএস স্তরের পার্থক্য আছে কি?

উত্তর:


677

ইউনিয়নের সাথে আপনার কেবলমাত্র একটি উপাদান ব্যবহার করার কথা, কারণ সেগুলি একই স্থানে সঞ্চিত রয়েছে। আপনি যখন এমন কোনও কিছু সঞ্চয় করতে চান যা এটি বেশ কয়েকটি ধরণের একটি হতে পারে তখন এটি দরকারী করে। অন্যদিকে একটি কাঠামোর প্রতিটি উপাদানগুলির জন্য পৃথক মেমরি অবস্থান রয়েছে এবং সেগুলি একবারে ব্যবহার করা যেতে পারে।

তাদের ব্যবহারের একটি দৃ concrete় উদাহরণ দেওয়ার জন্য, আমি কিছুক্ষণ আগে একটি স্কিম ইন্টারপ্রেটারে কাজ করছিলাম এবং আমি মূলত সি ডেটা ধরণের ক্ষেত্রে স্কিম ডেটা টাইপগুলি ওভারলাইজ করছিলাম। এটি স্ট্রাক্টে একটি এনামকে মানের ধরণ এবং সেই মানটি সংরক্ষণের জন্য একটি ইউনিয়ন নির্দেশ করে involved

union foo {
  int a;   // can't use both a and b at once
  char b;
} foo;

struct bar {
  int a;   // can use both a and b simultaneously
  char b;
} bar;

union foo x;
x.a = 3; // OK
x.b = 'c'; // NO! this affects the value of x.a!

struct bar y;
y.a = 3; // OK
y.b = 'c'; // OK

সম্পাদনা: আপনি যদি ভাবছেন যে এক্সবিটিকে 'সি' তে কী সেট করে XA এর মান পরিবর্তন করে, প্রযুক্তিগতভাবে বলতে গেলে এটি অপরিজ্ঞাত। বেশিরভাগ আধুনিক মেশিনে একটি চর 1 বাইট হয় এবং কোনও int 4 বাইট হয়, তাই xb মান 'সি' প্রদান করাও Xa এর প্রথম বাইটকে একই মান দেয়:

union foo x;
x.a = 3;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);

কপি করে প্রিন্ট

99, 99

দুটি মান একই কেন? কারণ ইন্ট্রি 3 এর শেষ 3 বাইটগুলি সমস্ত শূন্য, সুতরাং এটি 99 হিসাবেও পড়বে।

union foo x;
x.a = 387439;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);

কপি করে প্রিন্ট

387427, 99

প্রকৃত মেমরি মানগুলি ঘনিষ্ঠভাবে দেখতে, আসুন মানগুলি সেট করে প্রিন্ট করে হেক্স করুন:

union foo x;
x.a = 0xDEADBEEF;
x.b = 0x22;
printf("%x, %x\n", x.a, x.b);

কপি করে প্রিন্ট

deadbe22, 22

আপনি 0x22 0xEF ওভাররোট করে পরিষ্কার করে দেখতে পারেন।

কিন্তু

সি তে, কোন ইনট এ বাইটের ক্রম সংজ্ঞায়িত হয় না। এই প্রোগ্রামটি আমার ম্যাকটিতে 0x22 দিয়ে 0xEF ওভাররোট করে, তবে অন্যান্য প্ল্যাটফর্মগুলি যেখানে এটি 0xDE ওভাররাইট করে তার পরিবর্তে ইনট আপ করা বাইটের ক্রমটি বিপরীত ছিল। সুতরাং, কোনও প্রোগ্রাম লেখার সময় আপনাকে কোনও ইউনিয়নে নির্দিষ্ট ডেটা ওভাররাইট করার আচরণের উপর কখনই নির্ভর করা উচিত নয় কারণ এটি পোর্টেবল নয়।

বাইটের ক্রম সম্পর্কে আরও পড়ার জন্য, আধ্যাত্মিকতা পরীক্ষা করে দেখুন ।


1
এই উদাহরণটি ব্যবহার করে, ইউনিয়নে, যদি xb = 'সি' এক্সএতে কী সঞ্চয় হয়? এটা কি চরের রেফারেন্স #?
কাইলেক্স

1
আশা করা যায় যে আপনি xb সেট করার সময় XA এ কী সঞ্চিত আছে সে সম্পর্কে আরও বিশদে বিশদটি ব্যাখ্যা করবে
কাইল ক্রোনিন

1
@ কাইলক্রোনিন আমি মনে করি এটি পেয়েছি। আপনার ক্ষেত্রে, আপনার ধরণের একটি গ্রুপ রয়েছে, আপনার কেবলমাত্র একটিটি ব্যবহার করা দরকার তা জানেন তবে রানটাইম পর্যন্ত কোনটি জানেন না - তাই ইউনিয়ন আপনাকে এটি করতে দেয়। ধন্যবাদ
ব্যবহারকারী 12345613

2
@ user12345613 ইউনিয়নগুলি স্ট্র্টসের জন্য বেস শ্রেণির জন্য বাছাই করা যেতে পারে। স্ট্রাক্ট ইউনিয়নগুলি ব্যবহার করে আপনি একটি OO শ্রেণিবিন্যাস অনুকরণ করতে পারেন
মর্টেন জেনসেন

1
মাল্টি-বাইট প্রকারে @ লাজার বাইট ক্রমটি শেষের দিকে নির্ভর করে। আমি এটিতে উইকিপিডিয়া নিবন্ধটি পড়ার পরামর্শ দিচ্ছি।
কাইল ক্রোনিন

83

এখানে সংক্ষিপ্ত উত্তর: একটি কাঠামো একটি রেকর্ড কাঠামো: কাঠামোর প্রতিটি উপাদান নতুন স্থান বরাদ্দ করে। সুতরাং, মত একটি কাঠামো

struct foobarbazquux_t {
    int foo;
    long bar;
    double baz; 
    long double quux;
}

(sizeof(int)+sizeof(long)+sizeof(double)+sizeof(long double))প্রতিটি উদাহরণের জন্য মেমরিতে কমপক্ষে বাইটগুলি বরাদ্দ করে । ("কমপক্ষে" কারণ আর্কিটেকচার প্রান্তিককরণের সীমাবদ্ধতাগুলি কম্পাইলারকে স্ট্রাক প্যাড করতে বাধ্য করতে পারে))

অন্য দিকে,

union foobarbazquux_u {
    int foo;
    long bar;
    double baz; 
    long double quux;
}

এক অংশ মেমরি বরাদ্দ করে এবং এটিকে চারটি উপাধি দেয়। সুতরাং sizeof(union foobarbazquux_u) ≥ max((sizeof(int),sizeof(long),sizeof(double),sizeof(long double)), আবার প্রান্তিককরণের জন্য কিছু সংযোজনের সম্ভাবনা নিয়ে।


53

একটি 'স্ট্রাক্ট' এবং 'ইউনিয়নের' মধ্যে পার্থক্য দেওয়ার জন্য কোনও ভাল উদাহরণ আছে কি?

একটি কাল্পনিক যোগাযোগের প্রোটোকল

struct packetheader {
   int sourceaddress;
   int destaddress;
   int messagetype;
   union request {
       char fourcc[4];
       int requestnumber;
   };
};

এই কাল্পনিক প্রোটোকলে, এটি পৃথক করা হয়েছে যে "বার্তা প্রকার" এর উপর ভিত্তি করে শিরোনামের নীচের অবস্থানটি হয় একটি অনুরোধ নম্বর, বা একটি চার অক্ষরের কোড হবে, তবে উভয়ই নয়। সংক্ষেপে, ইউনিয়নগুলি একই স্টোরেজ অবস্থানের জন্য একাধিক ডেটা প্রকারের প্রতিনিধিত্ব করতে মঞ্জুরি দেয়, যেখানে এটির নিশ্চয়তা দেওয়া হয় যে আপনি যে কোনও সময়ে কেবলমাত্র এক ধরণের ডেটা সংরক্ষণ করতে চাইবেন।

ইউনিয়নগুলি সিস্টেম প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে সি এর heritageতিহ্যের ভিত্তিতে মূলত নিম্ন-স্তরের বিশদ, যেখানে "ওভারল্যাপিং" স্টোরেজ লোকেশনগুলি কখনও কখনও এইভাবে ব্যবহৃত হয়। আপনি কখনও কখনও ইউনিয়নগুলি মেমোরি সংরক্ষণ করতে ব্যবহার করতে পারেন যেখানে আপনার একটি ডেটা কাঠামো রয়েছে যেখানে এক সময়ে বিভিন্ন ধরণের কেবল একটির সংরক্ষণ করা হবে।

সাধারণভাবে, ওএস স্ট্রাক্ট এবং ইউনিয়নগুলির যত্ন করে না বা জানে না - তারা উভয়ই এটির জন্য মেমরির একমাত্র ব্লক। স্ট্রাক্ট মেমোরির একটি ব্লক যা বেশ কয়েকটি ডেটা অবজেক্টগুলিকে সঞ্চয় করে, যেখানে সেই বস্তুগুলি ওভারল্যাপ হয় না। একটি ইউনিয়ন মেমরির একটি ব্লক যা বেশ কয়েকটি ডেটা অবজেক্টগুলিকে সঞ্চয় করে তবে এর মধ্যে সবচেয়ে বড়টির জন্য কেবল স্টোরেজ থাকে এবং এইভাবে কেবল কোনও সময়ে ডেটা অবজেক্টগুলির মধ্যে একটি সংরক্ষণ করতে পারে।


1
হাঁ। এটি একটি ব্যবহারের কেস ভালভাবে ব্যাখ্যা করে!
জিদান

1
মনে করুন আপনার কাছে packetheader ph;কীভাবে আপনি অনুরোধটি অ্যাক্সেস করবেন? ph.request.requestnumber?
justin.m.chase

সেরা ব্যাখ্যা! ধন্যবাদ।
84RR1573R

39

আপনি ইতিমধ্যে আপনার প্রশ্নে উল্লেখ করেছেন যে, এর মধ্যে প্রধান পার্থক্য unionএবং structএটি হ'ল unionসদস্যরা একে অপরের স্মৃতিটিকে ওভারলে করে দেয় যাতে ইউনিয়নের আকার এক হয়, তবে structসদস্যরা একে অপরের পরে স্থাপন করা হয় (এর মধ্যে optionচ্ছিক প্যাডিং সহ)। এছাড়াও একটি ইউনিয়ন তার সমস্ত সদস্যকে ধারণ করার জন্য যথেষ্ট বড় এবং একটি সারিবদ্ধতা রয়েছে যা এর সমস্ত সদস্যের সাথে খাপ খায়। সুতরাং আসুন ধরা যাক intকেবল 2 বাইট অ্যাড্রেসে সঞ্চয় করা যেতে পারে এবং 2 বাইট প্রশস্ত এবং লম্বাটি কেবল 4 বাইট অ্যাড্রেসে সঞ্চয় করা যায় এবং 4 বাইট দীর্ঘ long নিম্নলিখিত ইউনিয়ন

union test {
    int a;
    long b;
}; 

sizeof4 এর একটি এবং একটি প্রান্তিককরণের প্রয়োজন 4 থাকতে পারে an কোনও কাঠামোতে লেখা কেবল লিখিত সদস্যের মান পরিবর্তন করে। কোনও ইউনিয়নের সদস্যকে লিখিতভাবে অন্য সমস্ত সদস্যের মান অবৈধ রেন্ডার করে। আপনি যদি তাদের কাছে আগে না লিখে থাকেন তবে আপনি এগুলি অ্যাক্সেস করতে পারবেন না, অন্যথায় আচরণটি সংজ্ঞায়িত। জিসিসি একটি এক্সটেনশন হিসাবে সরবরাহ করে যা আপনি আসলে কোনও ইউনিয়নের সদস্যদের কাছ থেকে পড়তে পারেন, যদিও আপনি তাদের কাছে সম্প্রতি লিখেছেন না। অপারেশন সিস্টেমের জন্য, কোনও ব্যবহারকারী প্রোগ্রাম কোনও ইউনিয়নে বা কোনও কাঠামোতে লেখেন কিনা তা বিবেচ্য নয়। এটি আসলে সংকলকের কেবল একটি সমস্যা।

ইউনিয়ন এবং কাঠামোর আরেকটি গুরুত্বপূর্ণ সম্পত্তি হ'ল, তারা অনুমতি দেয় যে তাদের কাছে একটি পয়েন্টার তার সদস্যদের যে কোনও ধরণের দিকে নির্দেশ করতে পারে । সুতরাং নিম্নলিখিতটি বৈধ:

struct test {
    int a;
    double b;
} * some_test_pointer;

some_test_pointer int*বা নির্দেশ করতে পারে double*। আপনি ধরনের একটি ঠিকানা নিক্ষেপ তাহলে testকরতে int*, এটা তার প্রথম সদস্য নির্দেশ করবে a, আসলে। ইউনিয়নের ক্ষেত্রেও একই কথা। সুতরাং, যেহেতু কোনও ইউনিয়নের সর্বদা সঠিক প্রান্তিককরণ থাকে, আপনি কোনও ইউনিয়নকে কোনও প্রকারের বৈধতা দেখানোর জন্য বৈধ করতে পারেন:

union a {
    int a;
    double b;
};

এই ইউনিয়নটি আসলে কোনও সংকেত এবং দ্বিগুণকে নির্দেশ করতে সক্ষম হবে:

union a * v = (union a*)some_int_pointer;
*some_int_pointer = 5;
v->a = 10;
return *some_int_pointer;    

C99 স্ট্যান্ডার্ড দ্বারা বর্ণিত হিসাবে আসলে বৈধ:

একটি অবজেক্টের তার সঞ্চিত মানটি কেবলমাত্র একটি মূল্যবান এক্সপ্রেশন দ্বারা অ্যাক্সেস করতে হবে যার নিম্নলিখিত ধরণের একটি রয়েছে:

  • বস্তুর কার্যকর ধরণের সাথে সামঞ্জস্যপূর্ণ একটি প্রকার
  • ...
  • একটি সামগ্রিক বা ইউনিয়ন প্রকার যা এর সদস্যদের মধ্যে পূর্বোক্ত ধরণের একটি অন্তর্ভুক্ত করে

সংকলকটির v->a = 10;মানটিকে প্রভাবিত করতে পারে বলে এটি অপ্টিমাইজ করবে না *some_int_pointer(এবং এর 10পরিবর্তে ফাংশনটি ফিরে আসবে 5)।


18

unionদুটি এক পরিস্থিতিতে উপযোগী। unionকার্নেলের জন্য ডিভাইস ড্রাইভার লেখার মতো খুব নিম্ন স্তরের কারসাজির জন্য একটি সরঞ্জাম হতে পারে।

যে একটি উদাহরণ একটি শবব্যবচ্ছেদের হয় floatব্যবহার করে সংখ্যা unionএকটি এর structbitfields এবং সঙ্গে float। আমি এর মধ্যে একটি নম্বর সংরক্ষণ করি floatএবং পরে আমি এর floatমাধ্যমে নির্দিষ্ট অংশগুলিতে অ্যাক্সেস করতে পারি struct। উদাহরণটি দেখায় যে কীভাবে unionডেটা দেখার জন্য বিভিন্ন কোণ ব্যবহার করা হয়।

#include <stdio.h>                                                                                                                                       

union foo {
    struct float_guts {
        unsigned int fraction : 23;
        unsigned int exponent : 8;
        unsigned int sign     : 1;
    } fg;
    float f;
};

void print_float(float f) {
    union foo ff;
    ff.f = f;
    printf("%f: %d 0x%X 0x%X\n", f, ff.fg.sign, ff.fg.exponent, ff.fg.fraction);

}

int main(){
    print_float(0.15625);
    return 0;
}

উইকিপিডিয়ায় একক নির্ভুলতার বিবরণ একবার দেখুন । আমি সেখান থেকে উদাহরণ এবং যাদু নম্বরটি ব্যবহার করেছি 0.15625।


unionবীজগণিত সংক্রান্ত ডেটা টাইপ প্রয়োগ করতেও একাধিক বিকল্প রয়েছে। ও'সুলিভান, স্টুয়ার্ট এবং গেরজেনের "রিয়েল ওয়ার্ল্ড হাস্কেল" বইয়ে আমি এর উদাহরণ পেয়েছি। বৈষম্যমূলক ইউনিয়ন বিভাগে এটি পরীক্ষা করে দেখুন ।

চিয়ার্স!


11

" ইউনিয়ন " এবং " কাঠামো " সি ভাষার গঠন r তাদের মধ্যে একটি "ওএস লেভেল" পার্থক্য সম্পর্কে কথা বলা অনুচিত, কারণ এটি সংকলক যেটি যদি আপনি এক বা অন্য কীওয়ার্ড ব্যবহার করেন তবে বিভিন্ন কোড তৈরি করে।


11

প্রযুক্তিগতভাবে না বলার অর্থ:

অনুমান: চেয়ার = মেমরি ব্লক, লোক = পরিবর্তনশীল

কাঠামো : যদি 3 জন লোক থাকে তবে তারা যথাযথভাবে তাদের আকারের চেয়ারে বসতে পারেন।

ইউনিয়ন : 3 জন লোক থাকলে সেখানে কেবল একটি চেয়ার বসতে পারে, তারা বসতে চাইলে সকলকে একই চেয়ার ব্যবহার করা উচিত।

প্রযুক্তিগতভাবে বলার অর্থ:

নীচে উল্লিখিত প্রোগ্রামটি একত্রে কাঠামো এবং ইউনিয়নে একটি গভীর ডুব দেয়।

struct MAIN_STRUCT
{
UINT64 bufferaddr;   
union {
    UINT32 data;
    struct INNER_STRUCT{
        UINT16 length;  
        UINT8 cso;  
        UINT8 cmd;  
           } flags;
     } data1;
};

ইউনিয়নের জন্য বাফেরড্ডার + সাইজফের জন্য (ইউএনটি 32) মোট এমএএসটিআরেক্ট আকার = মাপের (ইউআইএনটি 64) (ইউএনআইটি 32) প্যাডিংয়ের জন্য 32 বিট (প্রসেসরের আর্কিটেকচারের উপর নির্ভর করে) = 128 বিট। কাঠামোর জন্য সমস্ত সদস্য স্বচ্ছন্দে স্মৃতি ব্লক পান।

ইউনিয়ন সর্বোচ্চ আকারের সদস্যের একটি মেমরি ব্লক পেয়েছে (এটি এর 32 বিট)। ইউনিয়নের অভ্যন্তরে আরও একটি কাঠামো মিথ্যা (INNER_omotCT) এর সদস্যরা মোট আকার 32 বিট (16 + 8 + 8) এর একটি মেমরি ব্লক পান। ইউনিয়নে হয় INNER_StCT (32 বিট) সদস্য বা ডেটা (32 বিট) অ্যাক্সেস করা যায়।


দুর্দান্ত ব্যাখ্যা। চিয়ার্স!
প্রেম

11

হ্যাঁ, কাঠামো এবং ইউনিয়নের মধ্যে প্রধান পার্থক্যটি আপনি বলেছেন ঠিক একই। স্ট্রাক্ট তার সদস্যের সমস্ত মেমরি ব্যবহার করে এবং ইউনিয়ন বৃহত্তম সদস্যদের মেমরি স্পেস ব্যবহার করে।

কিন্তু সমস্ত পার্থক্য মেমরির প্রয়োজনের দ্বারা নিহিত। ইউনিয়নের সর্বোত্তম ব্যবহার ইউনিক্সের প্রক্রিয়াগুলিতে দেখা যায় যেখানে আমরা সংকেত ব্যবহার করি। প্রক্রিয়া যেমন একবারে শুধুমাত্র একটি সংকেত কাজ করতে পারে। সুতরাং সাধারণ ঘোষণাটি হবে:

union SIGSELECT
{
  SIGNAL_1 signal1;
  SIGNAL_2 signal2;
  .....
};

এই ক্ষেত্রে, প্রক্রিয়াটি সমস্ত সংকেতের কেবলমাত্র সর্বোচ্চ স্মৃতি ব্যবহার করে। তবে আপনি যদি এই ক্ষেত্রে কাঠামো ব্যবহার করেন তবে মেমরির ব্যবহার সমস্ত সংকেতের সমষ্টি হবে। অনেক পার্থক্য করে।

সংক্ষিপ্তসার হিসাবে, ইউনিয়ন নির্বাচন করা উচিত যদি আপনি জানেন যে আপনি একবারে যে কোনও একটি সদস্যের অ্যাক্সেস করেছেন।


10

তোমার কাছে আছে, এটাই সব। তবে তাই, মূলত, ইউনিয়নগুলির বিন্দুটি কী?

আপনি বিভিন্ন ধরণের একই অবস্থানের সামগ্রী রাখতে পারেন। আপনি ইউনিয়নে কী সংরক্ষণ করেছেন তার প্রকারটি জানতে হবে (প্রায়শই আপনি এটি structটাইপ ট্যাগ সহ একটি এনে রাখেন ...)।

ইহা কেন গুরুত্বপূর্ণ? স্থান লাভের জন্য আসলেই নয়। হ্যাঁ, আপনি কিছু বিট অর্জন করতে পারেন বা কিছু প্যাডিং করতে পারেন, তবে এটি এখন আর মূল বিষয় নয়।

এটি প্রকারের সুরক্ষার জন্য, এটি আপনাকে কোনও ধরণের 'ডায়নামিক টাইপিং' করতে সক্ষম করে: সংকলক জানে যে আপনার সামগ্রীর বিভিন্ন অর্থ হতে পারে এবং আপনার ব্যাখ্যাটি রান-টাইমে কীভাবে আপনার উপর নির্ভর করে তার সঠিক অর্থ হতে পারে। আপনার যদি কোনও পয়েন্টার থাকে যা বিভিন্ন ধরণের দিকে নির্দেশ করতে পারে, আপনি একটি ইউনিয়ন ব্যবহার করতে হবে, অন্যথায় আপনার এলিয়াস সমস্যার কারণে কোডটি ভুল হতে পারে (সংকলক নিজেই বলে "ওহ, কেবলমাত্র এই পয়েন্টারটি এই ধরণের দিকে নির্দেশ করতে পারে, তাই আমি অনুকূলিত করতে পারি এই অ্যাক্সেসগুলি বাইরে ... ", এবং খারাপ জিনিসগুলি ঘটতে পারে)।


9

একটি কাঠামো এতে সমস্ত উপাদানগুলির মোট আকার বরাদ্দ করে।

একটি ইউনিয়ন কেবল তার বৃহত্তম সদস্যের জন্য প্রয়োজনীয় মেমরির পরিমাণ বরাদ্দ করে।


2
আপনি এই ইউনিয়ন সদস্যদের একে অপরকে "ওভারলে" যুক্ত করতে চাইবেন যে তারা সবাই বরাদ্দকৃত ইউনিয়নের "কাঠামো" এর সূচনা ঠিকানার পরে শুরু করে।
জিম বাক

4

কাঠামো এবং ইউনিয়নের মধ্যে পার্থক্য কী?

শর্ট কাট উত্তরটি: শ্রদ্ধা মেমরি বরাদ্দ হয়। ব্যাখ্যা: কাঠামোয় কাঠামোর ভিতরে সমস্ত সদস্যের জন্য মেমরির স্থান তৈরি করা হবে। ইউনিয়নে মেমরির স্থান কেবলমাত্র এমন সদস্যের জন্য তৈরি করা হবে যার জন্য সবচেয়ে বড় মেমরি স্পেস প্রয়োজন। নিম্নলিখিত কোড বিবেচনা করুন:

struct s_tag
{
   int a; 
   long int b;
} x;

union u_tag
{
   int a; 
   long int b;
} y;

স্ট্রাক্ট এবং ইউনিয়নের ভিতরে এখানে দুটি সদস্য রয়েছে: অন্তর্নিহিত এবং দীর্ঘ অন্তর্নিহিত। ইন্টের জন্য মেমোরি স্পেস হ'ল: 4 বাইট এবং দীর্ঘ অন্তরের জন্য মেমরি স্পেস: 32 বিট অপারেটিং সিস্টেমে 8 8

সুতরাং কাঠামোর জন্য 4 + 8 = 12 বাইট তৈরি করা হবে এবং 8 বাইট ইউনিয়নের জন্য তৈরি করা হবে

কোড উদাহরণ:

#include<stdio.h>
struct s_tag
{
  int a;
  long int b;
} x;
union u_tag
{
     int a;
     long int b;
} y;
int main()
{
    printf("Memory allocation for structure = %d", sizeof(x));
    printf("\nMemory allocation for union = %d", sizeof(y));
    return 0;
}

রেফ: http://www.codingpractise.com/home/c-programming/st جوړ- এবং- ইউনিয়ন /


3

বিশেষ ধরণের কথোপকথনের প্রয়োজন হলে ইউনিয়ন ইউনিয়নগুলির ব্যবহার প্রায়শই ব্যবহৃত হয় are ইউনিয়নের উপযোগিতা সম্পর্কে ধারণা পেতে। সি / সি স্ট্যান্ডার্ড লাইব্রেরি কোনও ফাইলে সংক্ষিপ্ত পূর্ণসংখ্যার লেখার জন্য বিশেষভাবে ডিজাইন করা কোনও ফাংশন সংজ্ঞায়িত করে না। ফাইরাইট () ব্যবহার করা সহজ অপারেশনের জন্য অতিরিক্ত ওভারহেডকে আবদ্ধ করে। তবে ইউনিয়ন ব্যবহার করে আপনি সহজেই একটি ফাংশন তৈরি করতে পারেন যা একবারে একটি বাইটে একটি ফাইলের সাথে একটি সংক্ষিপ্ত পূর্ণসংখ্যার বাইনারি লিখতে পারে। আমি ধরে নিয়েছি যে সংক্ষিপ্ত পূর্ণসংখ্যা 2 বাইট দীর্ঘ

উদাহরণ:

#include<stdio.h>
union pw {
short int i;
char ch[2];
};
int putw(short int num, FILE *fp);
int main (void)
{
FILE *fp;
fp fopen("test.tmp", "wb ");
putw(1000, fp); /* write the value 1000 as an integer*/
fclose(fp);
return 0;
}
int putw(short int num, FILE *fp)
{
pw word;
word.i = num;
putc(word.c[0] , fp);
return putc(word.c[1] , fp);
}    

যদিও putw () আমি সংক্ষিপ্ত পূর্ণসংখ্যার সাথে কল করেছি, তবে এটি putc () এবং fwrit () ব্যবহার করা সম্ভব ছিল। তবে আমি ইউনিয়ন কীভাবে ব্যবহার করা যায় তা প্রাধান্য দেওয়ার জন্য একটি উদাহরণ দেখাতে চেয়েছিলাম


3

কাঠামো হ'ল বিভিন্ন ডেটা টাইপের সংগ্রহ যেখানে বিভিন্ন ধরণের ডেটা এতে থাকতে পারে এবং প্রত্যেকে তার নিজস্ব মেমরির ব্লক পেয়ে যায়

আমরা সাধারণত ইউনিয়নটি ব্যবহার করি যখন আমরা নিশ্চিত হয়েছি যে একবারে কেবলমাত্র একটি পরিবর্তনশীল ব্যবহার করা হবে এবং আপনি বর্তমান মেমরির সম্পূর্ণরূপে ব্যবহার করতে চান কারণ এটি মেমরির কেবল একটি ব্লক পায় যা সবচেয়ে বড় ধরণের সমান।

struct emp
{
    char x;//1 byte
    float y; //4 byte
} e;

মোট স্মৃতি এটি => 5 বাইট পায়

union emp
{
    char x;//1 byte
    float y; //4 byte
} e;

মোট স্মৃতি এটি = 4 বাইট পায়


2

ইউনিয়নগুলি বাইট অর্ডার ক্রিয়াকলাপটি লেখার সময় কার্যকর হয় যা নীচে দেওয়া হয়েছে। স্ট্রাক্ট দিয়ে এটি সম্ভব নয়।

int main(int argc, char **argv) {
    union {
        short   s;
        char    c[sizeof(short)];
    } un;

    un.s = 0x0102;

    if (sizeof(short) == 2) {
        if (un.c[0] == 1 && un.c[1] == 2)
            printf("big-endian\n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    } else
        printf("sizeof(short) = %d\n", sizeof(short));

    exit(0);
}
// Program from Unix Network Programming Vol. 1 by Stevens.

1

ইউনিয়ন স্ট্রাক্ট থেকে আলাদা যেমন ইউনিয়ন অন্যদের উপর পুনরাবৃত্তি করে: এটি একই মেমরির নতুন সংজ্ঞা দেয় যখন স্ট্রাক্ট একের পর এক ওভারল্যাপ বা পুনরায় সংজ্ঞা না দিয়ে সংজ্ঞায়িত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.