কেউ কখন ইউনিয়ন ব্যবহার করবে? এটি কি কেবলমাত্র সি-এর দিন থেকে বাকি?


133

আমি শিখেছি কিন্তু ইউনিয়নগুলি পাই না। আমি যে প্রতিটি সি বা সি ++ পাঠ্য পাঠ করি সেগুলি তাদের পরিচয় করিয়ে দেয় (কখনও কখনও পাস করার সময়) তবে কেন বা কোথায় সেগুলি ব্যবহার করবেন সে সম্পর্কে খুব কম ব্যবহারিক উদাহরণ দেওয়ার ঝোঁক রয়েছে। ইউনিয়নগুলি আধুনিক (বা এমনকি উত্তরাধিকার) ক্ষেত্রে কখন কার্যকর হবে? আমার সাথে কেবল দুটি অনুমান প্রোগ্রামিং মাইক্রোপ্রসেসর হবে যখন আপনার সাথে কাজ করার জন্য খুব সীমাবদ্ধ স্থান থাকবে, বা আপনি যখন কোনও এপিআই (বা এরকম কিছু) বিকাশ করছেন এবং আপনি শেষ ব্যবহারকারীকে একাধিক অবজেক্ট / প্রকারের কেবলমাত্র একটি উদাহরণ থাকতে বাধ্য করতে চান একবার. এই দুটি অনুমান এমনকি ডান কাছাকাছি?


31
সি / সি ++ কোনও ভাষা নয়। ইউনিয়নগুলি সিতে মাঝারিভাবে কার্যকর এবং সি ++ এ মূলত অকেজো। এটি বলা ঠিক হবে যে সি ++ এ তারা "সি ++ এর ভিত্তিতে সি ++ থেকে অবশেষ", তবে তারা "সি থেকে কেবলমাত্র কয়েক দিনের অবশেষ" বলে মনে হয় না যেন সি ++ সুপারসিডিস সি
আর .. গিটহাব বন্ধ হেল্পিং আইসিসি

12
ইউনিয়নগুলির জন্য সি ++ এর বিকল্পটি কী, বা সেগুলি সি ++ এ কেন অকার্যকর তা আপনি কী ব্যাখ্যা করতে পারেন?
রাসেল

3
ইউনিয়নগুলির জন্য সি ++ এর বিকল্প শ্রেণী এবং উত্তরাধিকার - সি এর ইউনিয়নগুলি প্রায় স্বতন্ত্রভাবে টাইপ-সেফ পলিমারফিজমের জন্য ব্যবহৃত হয়। কিছু ক্লাসে আরও ভাল হয়। (সি-স্টাইল পলিমারফিজমের জন্য ভিজেডির উত্তর দেখুন)
টোয়াইডাভিজ

6
@ আর ..: ইউনিয়ন এখনও সি ++ তে মাঝারিভাবে কার্যকর। নীচে উত্তর দেখুন।
মাইকেল 23

2
ইউনিয়নগুলি অপারেটিং সিস্টেমের সাহসিকতার জন্য, বা যেমন, একটি প্যাকেজ যা সাউন্ড ফাইলগুলিকে একত্রিত / বিচ্ছিন্ন করে তুলতে অসাধারণ মূল্যবান হতে পারে। এই জাতীয় প্রেক্ষাপটে এগুলি একাধিক বিভিন্ন উপায়ে ব্যবহার করা হয় - ডেটা / এন্ডিয়ান রূপান্তর, নিম্ন-স্তরের পলিমারফিজম, ইত্যাদি। হ্যাঁ, একই সমস্যার অন্যান্য সমাধান রয়েছে (মূলত পয়েন্টার ধরণের মধ্যে কাস্টিং) তবে ইউনিয়নগুলি প্রায়শই ক্লিনার এবং আরও ভাল স্ব-ডকুমেন্টিং হয়।
হট লিক্স

উত্তর:


105

ইউনিয়নগুলি সাধারণত একটি বৈষম্যকারীর সংস্থার সাথে ব্যবহৃত হয়: একটি পরিবর্তনশীল যা ইউনিয়নের ক্ষেত্রগুলির মধ্যে কোনটি বৈধ কিনা তা নির্দেশ করে। উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনি নিজের ভেরিয়েন্ট টাইপ তৈরি করতে চান :

struct my_variant_t {
    int type;
    union {
        char char_value;
        short short_value;
        int int_value;
        long long_value;
        float float_value;
        double double_value;
        void* ptr_value;
    };
};

তারপরে আপনি এটি ব্যবহার করবেন যেমন:

/* construct a new float variant instance */
void init_float(struct my_variant_t* v, float initial_value) {
    v->type = VAR_FLOAT;
    v->float_value = initial_value;
}

/* Increments the value of the variant by the given int */
void inc_variant_by_int(struct my_variant_t* v, int n) {
    switch (v->type) {
    case VAR_FLOAT:
        v->float_value += n;
        break;

    case VAR_INT:
        v->int_value += n;
        break;
    ...
    }
}

এটি প্রকৃতপক্ষে ভিজ্যুয়াল বেসিক ইন্টার্নালগুলিতে একটি সাধারণ প্রচলিত প্রথা।

বাস্তব উদাহরণের জন্য এসডিএল এর এসডিএল_ ইভেন্থ ইউনিয়ন দেখুন । ( প্রকৃত উত্স কোড এখানে )। typeইউনিয়নের শীর্ষে একটি ক্ষেত্র রয়েছে এবং প্রতিটি এসডিএল_ * ইভেন্ট স্ট্রাক্টে একই ক্ষেত্রটি পুনরাবৃত্তি হয়। তারপরে, সঠিক ইভেন্টটি পরিচালনা করতে আপনাকে typeক্ষেত্রের মান পরীক্ষা করতে হবে ।

সুবিধাগুলি সহজ: অপ্রয়োজনীয় মেমরি ব্যবহার না করে সমস্ত ইভেন্টের ধরণের হ্যান্ডেল করার জন্য একটি একক ডাটা টাইপ রয়েছে।


2
গ্রেট! সেক্ষেত্রে আমি এখন ভাবছি কেন এসডিএল ফাংশনটি কেবল শ্রেণিবদ্ধ হিসাবে চিহ্নিত করা হয়নি? এটি কি সি সামঞ্জস্যপূর্ণ এবং কেবল সি ++ নয়?
রাসেল

12
@ রাসেল সি ++ ক্লাসগুলি কোনও সি প্রোগ্রাম থেকে ব্যবহার করা যাবে না, তবে 'বাহ্যিক "সি" ব্লক ব্যবহার করে সি স্ট্রাক্ট / ইউনিয়নগুলি সহজেই সি ++ থেকে অ্যাক্সেস করা যায়।
vz0

1
এই বৈকল্পিক প্যাটার্ন প্রায়ই যেমন সংজ্ঞা প্রোগ্রামিং ভাষা দোভাষী জন্য ব্যবহার করা হয় struct objectমধ্যে github.com/petermichaux/bootstrap-scheme/blob/v0.21/scheme.c
আদম Rosenfield

1
অসাধারণ ব্যাখ্যা। ইউনিয়নগুলি কী ছিল তা আমি সবসময়ই জানতাম, তবে কেন কেউ তাদের ব্যবহারের জন্য যথেষ্ট পাগল হবে তার কোনও আসল-বিশ্ব কারণ দেখেনি :) উদাহরণের জন্য ধন্যবাদ।
রিওয়াল্ক

@ স্টারগাজার 12১১২, গুগলের কোডসার্ক: google.com/…
কাগালি-সান

87

আমি সি ++ ইউনিয়নগুলি দেখতে খুব সুন্দর। দেখে মনে হয় লোকেরা কেবল ব্যবহারের ক্ষেত্রেই চিন্তা করে যেখানে কেউ "স্থানে" ইউনিয়নের উদাহরণের মান পরিবর্তন করতে চায় (যা মনে হয় কেবল স্মৃতি বাঁচাতে বা সন্দেহজনক রূপান্তর সম্পাদন করে)।

বাস্তবে, ইউনিয়নগুলি একটি সফ্টওয়্যার ইঞ্জিনিয়ারিং সরঞ্জাম হিসাবে দুর্দান্ত শক্তি হতে পারে, এমনকি আপনি যখন কোনও ইউনিয়নের উদাহরণের মান পরিবর্তন করেন না তখনও

কেস 1 ব্যবহার করুন: গিরগিটি

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

struct Batman;
struct BaseballBat;

union Bat
{
    Batman brucewayne;
    BaseballBat club;
};

ReturnType1 f(void)
{
    BaseballBat bb = {/* */};
    Bat b;
    b.club = bb;
    // do something with b.club
}

ReturnType2 g(Bat& b)
{
    // do something with b, but how do we know what's inside?
}

Bat returnsBat(void);
ReturnType3 h(void)
{
    Bat b = returnsBat();
    // do something with b, but how do we know what's inside?
}

এটি প্রদর্শিত হয় যে প্রোগ্রামার যখন কোনও ইউনিয়ন উদাহরণ ব্যবহার করতে চায় তখন নির্দিষ্ট ধরণের বিষয়বস্তুর সম্পর্কে নিশ্চিত হতে হবে। এটি fউপরে ফাংশন ক্ষেত্রে । তবে, যদি কোনও ক্রিয়াকলাপটি কোনও সংঘের উদাহরণকে পাশের যুক্তি হিসাবে গ্রহণ করে, যেমন gউপরের ক্ষেত্রে হয় , তবে এটির সাথে কী করতে হবে তা এটি জানত না। ইউনিয়নের উদাহরণ ফিরিয়ে ফাংশনগুলির ক্ষেত্রেও একই প্রযোজ্য, দেখুনh : কলকারী ভিতরে কী আছে তা কীভাবে জানতে পারে?

যদি কোনও ইউনিয়ন উদাহরণ কখনও আর্গুমেন্ট বা রিটার্ন মান হিসাবে পাস না হয়, তবে প্রোগ্রামার যখন তার বিষয়বস্তু পরিবর্তন করতে বেছে নেয় তখন উত্তেজনার স্পাইক সহ এটি খুব একঘেয়ে জীবন ধারণ করতে বাধ্য bound

Batman bm = {/* */};
Baseball bb = {/* */};
Bat b;
b.brucewayne = bm;
// stuff
b.club = bb;

এবং এটি ইউনিয়নের সর্বাধিক (আন) জনপ্রিয় ব্যবহারের ক্ষেত্রে। আর একটি ব্যবহারের ক্ষেত্রে হ'ল যখন কোনও ইউনিয়নের উদাহরণ আসে এমন কিছু কিছু নিয়ে আসে যা আপনাকে এর ধরণটি বলে।

কেস 2 ব্যবহার করুন: "আপনার সাথে দেখা করে ভাল লাগছে object, আমি এসেছিClass "

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

তারপরে প্রোগ্রামারকে switchব্রুস ওয়েনকে কাঠের কাঠি বা সমতুল্য কিছু বাদ দিতে বলার জন্য একটি কন্ট্রোল ফ্লো স্টেটমেন্ট লিখতে হয় । এটি খুব খারাপ নয় যখন ইউনিয়নে কেবলমাত্র দুই ধরণের বিষয়বস্তু থাকে তবে স্পষ্টতই, ইউনিয়নটি আর স্কেল করে না।

কেস 3 ব্যবহার করুন:

আইএসও সি ++ স্ট্যান্ডার্ডের জন্য একটি সুপারিশের লেখক হিসাবে এটি 2008 সালে ফিরিয়ে দিয়েছে,

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

এবং এখন, একটি ইউএমএল বর্গ ডায়াগ্রাম সহ একটি উদাহরণ:

ক্লাস এ এর ​​জন্য অনেকগুলি রচনা

প্লেইন ইংরেজি পরিস্থিতি: বর্গ একটি অবজেক্ট করতে খ 1 মধ্যে কোনো ক্লাসের বস্তু আছে, ... বিএন, এবং প্রতিটি ধরনের সর্বাধিক একটি সঙ্গে এ এন একটি প্রশংসনীয় বড় সংখ্যা হচ্ছে বলে অন্তত 10।

আমরা এর মতো ক্ষেত্রগুলি (ডেটা সদস্য) যুক্ত করতে চাই না:

private:
    B1 b1;
    .
    .
    .
    Bn bn;

কারণ এন পৃথক হতে পারে (আমরা মিশ্রণে বিএক্স ক্লাস যুক্ত করতে চাই) এবং কারণ এটি নির্মাণকারীদের সাথে ঝামেলা সৃষ্টি করতে পারে এবং কারণ কোনও বস্তু প্রচুর স্থান গ্রহণ করবে।

আমরা তাদের পুনরুদ্ধারের জন্য কাস্টসযুক্ত বস্তুগুলিতে void*পয়েন্টারগুলির একটি কৌতুকপূর্ণ ধারক ব্যবহার করতে Bxপারি, তবে এটি পলক এবং তাই সি স্টাইল ... তবে আরও গুরুত্বপূর্ণ বিষয়টি আমাদের পরিচালনা করতে অনেক গতিশীল বরাদ্দকৃত অবজেক্টের লাইফটাইম ছেড়ে চলে যায়।

পরিবর্তে, যা করা যায় তা হ'ল:

union Bee
{
    B1 b1;
    .
    .
    .
    Bn bn;
};

enum BeesTypes { TYPE_B1, ..., TYPE_BN };

class A
{
private:
    std::unordered_map<int, Bee> data; // C++11, otherwise use std::map

public:
    Bee get(int); // the implementation is obvious: get from the unordered map
};

তারপরে, ইউনিয়নের উদাহরণের বিষয়বস্তু পেতে data, আপনি ব্যবহার করেন a.get(TYPE_B2).b2এবং পছন্দগুলি করেন, যেখানে aকোনও শ্রেণীর Aউদাহরণ রয়েছে।

ইউনিয়নগুলি সি ++ 11 এ সীমাবদ্ধ না থাকায় এটি আরও শক্তিশালী। দেখুন ডকুমেন্ট উপরে লিঙ্ক বা এই নিবন্ধটি বিস্তারিত জানার জন্য।


এটি খুব সহায়ক ছিল এবং দ্বিতীয় প্রবন্ধের সিরিজটি ছিল খুব তথ্যপূর্ণ। ধন্যবাদ।
অ্যান্ড্রু

38

একটি উদাহরণ এম্বেড থাকা রাজ্যে, যেখানে নিবন্ধের প্রতিটি বিটের অর্থ অন্যরকম হতে পারে। উদাহরণস্বরূপ, 8-বিট পূর্ণসংখ্যার একটি ইউনিয়ন এবং 8 টি পৃথক 1-বিট বিটফিল্ড সহ একটি কাঠামো আপনাকে হয় একটি বিট বা পুরো বাইট পরিবর্তন করতে দেয়।


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

11
আমি এটিকে "প্রস্তাবিত নয়" বলব না। এম্বেড থাকা জায়গায় এটি বিকল্পগুলির চেয়ে প্রায়শই পরিষ্কার এবং কম ত্রুটি-প্রবণ থাকে, যা সাধারণত প্রচুর পরিমাণে সুস্পষ্ট ক্যাসেট এবং void*গুলি বা মুখোশ এবং শিফ্টের সাথে জড়িত ।
বিটিএ

হেহ? প্রচুর সুস্পষ্ট কাস্ট? মত সহজ বিবৃতি আমার মনে হচ্ছে REG |= MASKএবং REG &= ~MASK। যদি এটি ত্রুটিযুক্ত থাকে তবে এগুলিকে একটি #define SETBITS(reg, mask)এবং এ দিন #define CLRBITS(reg, mask)। কোনও নির্দিষ্ট ক্রমে বিটগুলি পেতে সংকলকটির উপর নির্ভর করবেন না ( স্ট্যাকওভারফ্লো / সেকশনস / 1490092/… )
মাইকেল

26

ভেষজ সুটার জিওটিডব্লিউতে প্রায় ছয় বছর আগে লিখেছিলেন , জোর দিয়ে যোগ করেছেন:

"তবে মনে করবেন না যে ইউনিয়নগুলি পূর্ববর্তী সময়ের থেকে কেবল একটি হোল্ডওভার হয়ে গেছে data ইউনিয়নগুলি সম্ভবত ডেটা ওভারল্যাপের অনুমতি দিয়ে স্থান বাঁচানোর জন্য সবচেয়ে দরকারী এবং এটি সি ++ এবং আজকের আধুনিক বিশ্বে এখনও পছন্দসই example উদাহরণস্বরূপ, বেশিরভাগ ক্ষেত্রে উন্নত সি ++বিশ্বে স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়ন এখন "ছোট স্ট্রিং অপ্টিমাইজেশন" প্রয়োগের জন্য কেবল এই কৌশলটি ব্যবহার করে, একটি দুর্দান্ত অপ্টিমাইজেশন বিকল্প যা স্ট্রিং অবজেক্টের ভিতরে স্টোরেজটি পুনরায় ব্যবহার করে: বড় স্ট্রিংগুলির জন্য, স্ট্রিং অবজেক্টের অভ্যন্তরের স্থানটি স্বাভাবিক পয়েন্টারটিকে গতিশীলভাবে সংরক্ষণ করে বাফারের আকারের মতো বরফত বরফ এবং গৃহকর্ম সম্পর্কিত তথ্য; ছোট স্ট্রিংয়ের জন্য, একই স্থানটি পরিবর্তে স্ট্রিংয়ের সামগ্রী সরাসরি সংরক্ষণ করতে এবং কোনও গতিশীল মেমরির বরাদ্দকে সম্পূর্ণ এড়াতে ব্যবহৃত হয় is ছোট স্ট্রিং অপ্টিমাইজেশান (এবং অন্যান্য স্ট্রিং অপ্টিমাইজেশান এবং যথেষ্ট গভীরতায় হতাশা) সম্পর্কে আরও জানতে, দেখুন ... "

এবং কম দরকারী উদাহরণের জন্য, দীর্ঘ কিন্তু অনির্বাচিত প্রশ্ন জিসিসি, কঠোর-আলিয়াজিং এবং ইউনিয়নের মাধ্যমে কাস্টিং দেখুন


23

ভাল, একটি উদাহরণ ব্যবহারের ক্ষেত্রে আমি ভাবতে পারি তা হ'ল:

typedef union
{
    struct
    {
        uint8_t a;
        uint8_t b;
        uint8_t c;
        uint8_t d;
    };
    uint32_t x;
} some32bittype;

তারপরে আপনি সেই 32-বিট ডেটা ব্লকের 8-বিট পৃথক অংশ অ্যাক্সেস করতে পারবেন; যাইহোক, অন্তর্ভুক্তি দ্বারা সম্ভাব্য কামড়িত হতে প্রস্তুত।

এটি কেবল একটি অনুমানমূলক উদাহরণ, তবে আপনি যখনই কোনও ক্ষেত্রের ডেটাগুলিকে এর মতো উপাদানগুলিতে ভাগ করতে চান, আপনি একটি ইউনিয়ন ব্যবহার করতে পারেন।

এটি বলেছিল, এখানে একটি পদ্ধতি রয়েছে যা এন্ডিয়ান-নিরাপদ:

uint32_t x;
uint8_t a = (x & 0xFF000000) >> 24;

উদাহরণস্বরূপ, যেহেতু বাইনারি অপারেশন সংকলক দ্বারা সঠিক এন্ডিয়নেসে রূপান্তরিত হবে।


আমি মনে করি যে প্রশ্নটি কখনই ইউনিয়ন ব্যবহার করা উচিত as আপনি যেখানে একটি ইউনিয়ন সঠিক সরঞ্জাম নয় তার একটি উত্তর সরবরাহ করেছেন , যা আমি মনে করি এই উত্তরে আরও স্পষ্ট করা উচিত।
মাইকেল

15

ইউনিয়নগুলির জন্য কিছু ব্যবহার:

  • অজানা বাহ্যিক হোস্টকে একটি সাধারণ এডিয়েনেস ইন্টারফেস সরবরাহ করুন।
  • বিদেশী সিপিইউ আর্কিটেকচার ভাসমান পয়েন্ট ডেটা, যেমন কোনও নেটওয়ার্ক লিঙ্ক থেকে ভ্যাক্স জি_ফ্লাএটিএস গ্রহণ করা এবং প্রসেসিংয়ের জন্য তাদের আইইইই 754 লম্বা রিয়েলে রূপান্তর করা Man
  • একটি উচ্চ-স্তরের প্রকারে সোজা বিট টুইডলিং অ্যাক্সেস সরবরাহ করুন।
union {
      unsigned char   byte_v[16];
      long double     ld_v;
 }

এই ঘোষণার সাথে, একটি এর হেক্স বাইট মানগুলি প্রদর্শন করা long double, এক্সপোনেন্টারের চিহ্নটি পরিবর্তন করা, এটি কোনও নরমাল মান কিনা তা নির্ধারণ করা, বা সিপিইউ সমর্থন করে না এমন লম্বা ডাবল পাটিগণিত বাস্তবায়ন করা সহজ etc.

  • ক্ষেত্রগুলি নির্দিষ্ট মানগুলির উপর নির্ভরশীল যখন স্টোরেজ স্পেস সংরক্ষণ করে:

    class person {  
        string name;  
    
        char gender;   // M = male, F = female, O = other  
        union {  
            date  vasectomized;  // for males  
            int   pregnancies;   // for females  
        } gender_specific_data;
    }
  • আপনার সংকলকটি ব্যবহারের জন্য অন্তর্ভুক্ত করা ফাইলগুলি গ্রেপ করুন। আপনি কয়েক ডজন থেকে কয়েকশ ব্যবহার এর সন্ধান পাবেন union:

    [wally@zenetfedora ~]$ cd /usr/include
    [wally@zenetfedora include]$ grep -w union *
    a.out.h:  union
    argp.h:   parsing options, getopt is called with the union of all the argp
    bfd.h:  union
    bfd.h:  union
    bfd.h:union internal_auxent;
    bfd.h:  (bfd *, struct bfd_symbol *, int, union internal_auxent *);
    bfd.h:  union {
    bfd.h:  /* The value of the symbol.  This really should be a union of a
    bfd.h:  union
    bfd.h:  union
    bfdlink.h:  /* A union of information depending upon the type.  */
    bfdlink.h:  union
    bfdlink.h:       this field.  This field is present in all of the union element
    bfdlink.h:       the union; this structure is a major space user in the
    bfdlink.h:  union
    bfdlink.h:  union
    curses.h:    union
    db_cxx.h:// 4201: nameless struct/union
    elf.h:  union
    elf.h:  union
    elf.h:  union
    elf.h:  union
    elf.h:typedef union
    _G_config.h:typedef union
    gcrypt.h:  union
    gcrypt.h:    union
    gcrypt.h:    union
    gmp-i386.h:  union {
    ieee754.h:union ieee754_float
    ieee754.h:union ieee754_double
    ieee754.h:union ieee854_long_double
    ifaddrs.h:  union
    jpeglib.h:  union {
    ldap.h: union mod_vals_u {
    ncurses.h:    union
    newt.h:    union {
    obstack.h:  union
    pi-file.h:  union {
    resolv.h:   union {
    signal.h:extern int sigqueue (__pid_t __pid, int __sig, __const union sigval __val)
    stdlib.h:/* Lots of hair to allow traditional BSD use of `union wait'
    stdlib.h:  (__extension__ (((union { __typeof(status) __in; int __i; }) \
    stdlib.h:/* This is the type of the argument to `wait'.  The funky union
    stdlib.h:   causes redeclarations with either `int *' or `union wait *' to be
    stdlib.h:typedef union
    stdlib.h:    union wait *__uptr;
    stdlib.h:  } __WAIT_STATUS __attribute__ ((__transparent_union__));
    thread_db.h:  union
    thread_db.h:  union
    tiffio.h:   union {
    wchar.h:  union
    xf86drm.h:typedef union _drmVBlank {

5
টিএসকি! দুটি ডাউনভোট এবং কোনও ব্যাখ্যা নেই। হতাশাজনক।
wallyk

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

4
আমার ধারণা, আপনি "কাস্ট্রেটেড" বা "গর্ভাবস্থা" ইউনিয়নের ডাউনভোট পেয়েছেন। এটি কিছুটা অসুস্থ।
আকতারার

2
হ্যাঁ, আমি অনুমান করি এটি একটি অন্ধকার দিন ছিল।
wallyk

14

বাইট-লেভেল (নিম্ন স্তরের) ডেটা নিয়ে কাজ করার সময় ইউনিয়নগুলি কার্যকর হয়।

আমার সাম্প্রতিক ব্যবহারের একটি আইপি অ্যাড্রেস মডেলিংয়ে ছিল যা দেখতে নীচের মত দেখাচ্ছে:

// Composite structure for IP address storage
union
{
    // IPv4 @ 32-bit identifier
    // Padded 12-bytes for IPv6 compatibility
    union
    {
        struct
        {
            unsigned char _reserved[12];
            unsigned char _IpBytes[4];
        } _Raw;

        struct
        {
            unsigned char _reserved[12];
            unsigned char _o1;
            unsigned char _o2;
            unsigned char _o3;
            unsigned char _o4;    
        } _Octet;    
    } _IPv4;

    // IPv6 @ 128-bit identifier
    // Next generation internet addressing
    union
    {
        struct
        {
            unsigned char _IpBytes[16];
        } _Raw;

        struct
        {
            unsigned short _w1;
            unsigned short _w2;
            unsigned short _w3;
            unsigned short _w4;
            unsigned short _w5;
            unsigned short _w6;
            unsigned short _w7;
            unsigned short _w8;   
        } _Word;
    } _IPv6;
} _IP;

7
তবে মনে রাখবেন যে কাঁচা জিনিস অ্যাক্সেস করা মানসম্মত নয়, এবং সমস্ত সংকলকগুলির সাথে প্রত্যাশার মতো কাজ করতে পারে না।
টি

3
এছাড়াও, এটিকে এমনভাবে ব্যবহার করা দেখতে পাওয়া যায় যা প্রান্তিককরণের গ্যারান্টি দেয় না, যা অপরিজ্ঞাত আচরণ।
মাকিং হাঁস

10

একটি ইউনিয়ন ব্যবহার করার সময় একটি উদাহরণ:

class Vector
{
        union 
        {
            double _coord[3];
            struct 
            {
                double _x;
                double _y; 
                double _z;
            };

        };
...
}

এটি আমাকে অ্যারে বা উপাদান হিসাবে আমার ডেটা অ্যাক্সেস করতে দেয়।

আমি বিভিন্ন ইউনিয়ন একই মানকে নির্দেশ করতে একটি ইউনিয়ন ব্যবহার করেছি। চিত্র প্রক্রিয়াকরণে, আমি কলাম বা প্রস্থে বা এক্স দিকের আকারে কাজ করছি কিনা তা বিভ্রান্তিকর হয়ে উঠতে পারে। এই সমস্যাটি দূর করার জন্য, আমি একটি ইউনিয়ন ব্যবহার করি যাতে আমি জানি যে কোন বিবরণ একসাথে যায়।

   union {   // dimension from left to right   // union for the left to right dimension
        uint32_t            m_width;
        uint32_t            m_sizeX;
        uint32_t            m_columns;
    };

    union {   // dimension from top to bottom   // union for the top to bottom dimension
        uint32_t            m_height;
        uint32_t            m_sizeY;
        uint32_t            m_rows;
    };

12
দ্রষ্টব্য, যদিও এই সমাধানটি বেশিরভাগ পর্যবেক্ষণযোগ্য প্ল্যাটফর্মগুলিতে কাজ করে, _x, _y, _z এ মান নির্ধারণ করে এবং _ কোডটি অ্যাক্সেস করা একটি অপরিজ্ঞাত আচরণ। ইউনিয়নগুলির মূল উদ্দেশ্য স্থান সংরক্ষণ করা। আপনি পূর্বে যে ইউনিয়ন উপাদানটি সেট করেছিলেন ঠিক সেটিকে অবশ্যই অ্যাক্সেস করতে হবে।
এনজিক্স

1
এইভাবে আমি এটিও ব্যবহার করি, অন্যথায় আমি স্টাডি :: অ্যারে ফোর কর্ড এবং কিছু স্ট্যাটিক_সেসর্ট ব্যবহার করি
ভিক্টর

1
এই কোডটি কঠোর aliasing নিয়ম লঙ্ঘন এবং সুপারিশ করা উচিত নয়।
ওয়াল্টার

ইউনিয়নটিকে উন্নত করার কোনও উপায় আছে যে এটি করা নির্ভরযোগ্য হবে?
অ্যান্ড্রু

8

ইউনিয়নগুলি সিতে পলিমারফিজম সরবরাহ করে


18
আমি ভেবেছিলাম void*যে

2
@ ব্যবহারকারী 166390 পলিমারফিজম একাধিক প্রকারের হস্তক্ষেপের জন্য একই ইন্টারফেস ব্যবহার করছে; শূন্য * এর কোন ইন্টারফেস নেই।
এলিস

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

7

ইউনিয়নের একটি উজ্জ্বল ব্যবহার হ'ল মেমরি সারিবদ্ধকরণ, যা আমি পিসিএল (পয়েন্ট ক্লাউড লাইব্রেরি) উত্স কোডে পেয়েছি। এপিআইতে একক ডেটা স্ট্রাকচার দুটি আর্কিটেকচারকে লক্ষ্য করতে পারে: এসএসই সমর্থন সহ সিপিইউ পাশাপাশি এসএসই সমর্থন ছাড়াই সিপিইউ। যেমন: পয়েন্টএক্সজেডের জন্য ডেটা স্ট্রাকচার

typedef union
{
  float data[4];
  struct
  {
    float x;
    float y;
    float z;
  };
} PointXYZ;

3 টি ফ্লোট এসএসই প্রান্তিককরণের জন্য অতিরিক্ত ফ্লোটের সাথে প্যাড করা হয়। অনেক দূরে

PointXYZ point;

এক্স কারাডিনেট বলতে এক্সেস করার জন্য ব্যবহারকারী পয়েন্ট.ডেটা [0] অথবা পয়েন্ট.এক্স (এসএসই সমর্থনের উপর নির্ভর করে) অ্যাক্সেস করতে পারবেন। আরও অনুরূপ আরও ভাল ব্যবহারের বিশদটি নিম্নলিখিত লিঙ্কটিতে রয়েছে: পিসিএল ডকুমেন্টেশন পয়েন্টটি টাইপ


7

unionকীওয়ার্ডটি এখনও সি ব্যবহৃত ++, 03 1 , বেশিরভাগ সি দিনের একটি অবশেষ হয়। সর্বাধিক উদ্বেগজনক সমস্যাটি হ'ল এটি কেবল পড 1 নিয়ে কাজ করে ।

ইউনিয়নের ধারণাটি এখনও বিদ্যমান এবং বুস্ট লাইব্রেরিতে ইউনিয়নের মতো শ্রেণির বৈশিষ্ট্য রয়েছে:

boost::variant<std::string, Foo, Bar>

যার বেশিরভাগ সুবিধা রয়েছে union(সমস্ত না থাকলে) এবং যুক্ত করে:

  • নন-পিওডি টাইপগুলি সঠিকভাবে ব্যবহার করার ক্ষমতা
  • স্থিতিশীল সুরক্ষা

অনুশীলনে, এটি প্রদর্শিত হয়েছে যে এটি union+ এর সংমিশ্রণের সমতুল্য ছিল enumএবং বেঞ্চমার্ক করে যে এটি তত দ্রুত ছিল (যদিও এটি আরটিটিআই ব্যবহার করে boost::anyতাই এর ক্ষেত্রের আরও বেশি dynamic_cast)।

1 ইউনিয়নগুলি সি ++ 11 ( সীমাহীন ইউনিয়ন ) গুলিতে আপগ্রেড করা হয়েছিল এবং এখন এটি ধ্বংসকারীদের সাথে থাকা বস্তুগুলি ধারণ করতে পারে, যদিও ব্যবহারকারীকে ম্যানুয়ালি (বর্তমানে সক্রিয় ইউনিয়ন সদস্যের) ডাস্ট্রাক্টরকে ডাকতে হবে। এটি এখনও বৈকল্পিকগুলি ব্যবহার করা আরও সহজ।


এটি সি ++ এর আরও সাম্প্রতিক সংস্করণগুলিতে আর সত্য নয়। উদাহরণস্বরূপ jrsala এর উত্তর দেখুন।
অ্যান্ড্রু

@ অ্যান্ড্রু: আমি জড়িত ইউনিয়ন সহ সি ++ 11, ধ্বংসকারীদের সাথে ধরণের ইউনিয়নে সংরক্ষণের অনুমতিপ্রাপ্ত জবাবটি উল্লেখ করে উত্তরটি আপডেট করেছি। আমি এখনও আমার ভঙ্গি যে আপনার সত্যিই অনেক ব্যবহার বন্ধ আরও ভাল হয় পাশে দাঁড়ানো বাঁধা ইউনিয়ন যেমন boost::variantচেয়ে তাদের নিজস্ব ইউনিয়ন ব্যবহার করতে চেষ্টা করুন। ইউনিয়নগুলির আশেপাশে অনেক বেশি অপরিজ্ঞাত আচরণ রয়েছে যে এটি সঠিক হওয়ার সম্ভাবনাগুলি একেবারেই অস্বাভাবিক।
ম্যাথিউ এম।

3

ইউনিয়ন সম্পর্কিত উইকিপিডিয়া নিবন্ধ থেকে :

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

একটি সাধারণ সি প্রোগ্রামিং আইডিয়োম ইউনিয়নগুলির একটি ক্ষেত্রকে বরাদ্দ করে এবং অন্যের কাছ থেকে পাঠ করে সি ++ একটি পুনরায় সংজ্ঞা_কাস্ট বলে যা সম্পাদন করতে ইউনিয়নগুলি ব্যবহার করে যা কোডগুলিতে করা হয় যা মানগুলির কাঁচা উপস্থাপনার উপর নির্ভর করে।


2

সি এর প্রথম দিকের দিনগুলিতে (যেমন 1974 সালের নথি হিসাবে) সমস্ত কাঠামো তাদের সদস্যদের জন্য একটি সাধারণ নাম স্থান ভাগ করে নিয়েছিল। প্রতিটি সদস্যের নাম একটি টাইপ এবং একটি অফসেটের সাথে যুক্ত ছিল; যদি "ডাব্লুডি_উজল" অফসেট 12 এ "ইনট" হয়, তবে pকোনও কাঠামোর ধরণের একটি পয়েন্টার দেওয়া p->wd_woozleহলে এটি সমতুল্য হবে *(int*)(((char*)p)+12)। ভাষার প্রয়োজনীয় ছিল যে সমস্ত কাঠামোর ধরণের সমস্ত সদস্যের স্বতন্ত্র নাম ব্যতীত এটি স্পষ্টভাবে সদস্যের নামগুলি পুনরায় ব্যবহারের ক্ষেত্রে ক্ষেত্রে ব্যবহৃত হয় যেখানে প্রতিটি কাঠামো যেখানে ব্যবহৃত হয় তাদেরকে সাধারণ প্রাথমিক ক্রম হিসাবে বিবেচনা করা হয়।

কাঠামোর প্রকারগুলি দৃ .়তার সাথে ব্যবহার করা যেতে পারে তার ফলে কাঠামোগুলি এমন আচরণ করা সম্ভব করেছিল যাতে তারা ওভারল্যাপিং ক্ষেত্রগুলি অন্তর্ভুক্ত করে। উদাহরণস্বরূপ, প্রদত্ত সংজ্ঞা:

struct float1 { float f0;};
struct byte4  { char b0,b1,b2,b3; }; /* Unsigned didn't exist yet */

কোড "ফ্লোট 1" টাইপের কাঠামো ঘোষণা করতে পারে এবং তারপরে স্বতন্ত্র বাইটগুলি অ্যাক্সেস করতে "সদস্য" বি 0 ... বি 3 ব্যবহার করতে পারে। যখন ভাষাটি পরিবর্তন করা হয়েছিল যাতে প্রতিটি কাঠামো তার সদস্যদের জন্য একটি পৃথক নাম স্থান গ্রহণ করে, এমন কোড যা একাধিক উপায়ে জিনিসগুলিতে অ্যাক্সেসের দক্ষতার উপর নির্ভর করেছিল তা ভঙ্গ হবে। বিভিন্ন কাঠামোর ধরণের জন্য নেমস্পেসগুলি পৃথক করার মানগুলি পর্যাপ্ত ছিল যে এ জাতীয় কোডটি এটির সাথে যুক্ত করার জন্য পরিবর্তন করা প্রয়োজন, তবে এই জাতীয় প্রযুক্তির মান ভাষাটিকে সমর্থন অব্যাহত রাখতে প্রসারিত করে তা প্রমাণ করার পক্ষে যথেষ্ট ছিল।

কোড যা মধ্যে সংগ্রহস্থল অ্যাক্সেস করার ক্ষমতা কাজে লাগান লেখা হয়েছে struct float1যেন এটি একটি ছিল struct byte4ঘোষণা যোগ করে নতুন ভাষায় কাজ করার জন্য তৈরি করা যেতে পারে: union f1b4 { struct float1 ff; struct byte4 bb; };টাইপ করবেন, ঘোষণা বস্তু union f1b4;বদলে struct float1, এবং ব্যবহারের প্রতিস্থাপন f0, b0, b1, ইত্যাদি । সঙ্গে ff.f0, bb.b0, bb.b1, ইত্যাদি যদিও সেখানে ভাল উপায় যেমন কোডটি সমর্থিত করা হয়ে থাকতে পারে হয়, unionপদ্ধতির অন্তত কিছুটা কার্যকর, অন্তত এলিয়াসিং নিয়ম C89 যুগের ব্যাখ্যা সঙ্গে ছিল।


1

আপনাকে বলুন যে আপনার এন বিভিন্ন ধরণের কনফিগারেশন রয়েছে (কেবলমাত্র প্যারামিটারগুলি নির্ধারণ করে ভেরিয়েবলগুলির একটি সেট) being কনফিগারেশন ধরণের একটি অঙ্ক ব্যবহার করে আপনি একটি কাঠামো নির্ধারণ করতে পারেন যা কনফিগারেশনের ধরণের আইডি রয়েছে এবং বিভিন্ন ধরণের কনফিগারেশনের একটি ইউনিয়নও রয়েছে।

আপনি কনফিগারেশনটি যেখানেই পাস করবেন না কেন কনফিগারেশন ডেটার ব্যাখ্যা করতে হবে তা নির্ধারণ করতে আইডি ব্যবহার করতে পারেন, তবে কনফিগারেশনগুলি যদি বিশাল ছিল তবে আপনাকে প্রতিটি সম্ভাব্য টাইপের নষ্ট স্থানের জন্য সমান্তরাল কাঠামো রাখতে বাধ্য করা হবে না।


1

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

আপনি সি স্ট্যান্ডার্ড লঙ্ঘন না করে টাইপ-পেনিংয়ের জন্য ইউনিয়নগুলি করতে পারেন ।
এই প্রোগ্রামটির অনির্দিষ্ট আচরণ রয়েছে (কারণ আমি ধরে নিয়েছি floatএবং unsigned intএকই দৈর্ঘ্য রয়েছে) তবে অপরিবর্তিত আচরণ নয় ( এখানে দেখুন )।

#include <stdio.h> 

union float_uint
{
    float f;
    unsigned int ui;
};

int main()
{
    float v = 241;
    union float_uint fui = {.f = v};

    //May trigger UNSPECIFIED BEHAVIOR but not UNDEFINED BEHAVIOR 
    printf("Your IEEE 754 float sir: %08x\n", fui.ui);

    //This is UNDEFINED BEHAVIOR as it violates the Strict Aliasing Rule
    unsigned int* pp = (unsigned int*) &v;

    printf("Your IEEE 754 float, again, sir: %08x\n", *pp);

    return 0;
}

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

1

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

struct Number{
enum NumType{int32, float, double, complex}; NumType num_t;
union{int ival; float fval; double dval; ComplexNumber cmplx_val}
}

সুতরাং আপনি মেমোরিটি সংরক্ষণ করছেন এবং এর চেয়ে বেশি গুরুত্বপূর্ণ - আপনি সম্ভবত ছোট পরিমাণের বস্তুগুলির (শ্রেণীর উত্তরাধিকার / বহুবৈচিত্র্যের মাধ্যমে বাস্তবায়নের তুলনায়) প্রচুর পরিমাণে (যদি আপনি প্রচুর রান-টাইম সংজ্ঞায়িত সংখ্যক ব্যবহার করেন) জন্য কোনও গতিশীল বরাদ্দ এড়াতে পারেন তবে আরও আকর্ষণীয় কী, আপনি এখনও এই ধরণের কাঠামোর সাথে সি ++ পলিমারফিজম (আপনি যদি ডাবল প্রেরণের অনুরাগী হন;) ব্যবহার করতে পারেন। এই স্ট্রাক্টের ক্ষেত্র হিসাবে সমস্ত সংখ্যার প্যারেন্ট ক্লাসে কেবল "ডামি" ইন্টারফেস পয়েন্টার যুক্ত করুন, কাঁচা টাইপের পরিবর্তে / পরিবর্তে এই উদাহরণটি নির্দেশ করে বা ভাল পুরানো সি ফাংশন পয়েন্টার ব্যবহার করুন।

struct NumberBase
{
virtual Add(NumberBase n);
...
}
struct NumberInt: Number
{
//implement methods assuming Number's union contains int
NumberBase Add(NumberBase n);
...
}
struct NumberDouble: Number
{
 //implement methods assuming Number's union contains double
 NumberBase Add(NumberBase n);
 ...
}
//e.t.c. for all number types/or use templates
struct Number: NumberBase{
 union{int ival; float fval; double dval; ComplexNumber cmplx_val;}
 NumberBase* num_t;
 Set(int a)
 {
 ival=a;
  //still kind of hack, hope it works because derived classes of   Number    dont add any fields
 num_t = static_cast<NumberInt>(this);
 }
}

সুতরাং আপনি স্যুইচ (টাইপ) দিয়ে - টাইপ চেকের পরিবর্তে মেমোরি-দক্ষ প্রয়োগের সাথে (ছোট বস্তুর কোনও গতিশীল বরাদ্দ নেই) ব্যবহার করে বহুবৈচিত্র্য ব্যবহার করতে পারেন - যদি আপনার অবশ্যই এটি প্রয়োজন হয়।


গতিশীল ভাষা করার সময় এটি কার্যকর হতে পারে। আমার মনে হয় যে সমস্যাটি এটি সমাধান করবে তা হ'ল এই পরিবর্তনটি এনটি প্রয়োগ না করে ভর করে অজানা প্রকারের একটি পরিবর্তনশীলকে পরিবর্তন করা। এর জন্য ম্যাক্রো ভয়ঙ্কর এবং উদ্দীপনা কার্যত অসম্ভব।
অ্যান্ড্রু

0

Http://cplus.about.com/od/learningc/ss/lowlevel_9.htm থেকে :

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

union intptr {   int i;   int * p; }; 
union intptr x; x.i = 1000; 
/* puts 90 at location 1000 */ 
*(x.p)=90; 

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

struct head {   int id;   int response;   int size; }; struct msgstring50 {    struct head fixed;    char message[50]; } struct

msg msgstring80 {স্ট্রাক মাথা স্থির; চর বার্তা [80]; }
Struct হয় msgint10 {struct হয় মাথা স্থির; int বার্তা [10]; msg msg @ int ঠিক আছে; } ইউনিয়ন বার্তা টাইপ {
ম্যাসেজটাইপ স্ট্রাক্ট @ স্ট্রিং 50 এম 50; msg mststring80 m80; msg msg }

অনুশীলনে, ইউনিয়নগুলি একই আকারের হলেও এটি কেবল অর্থবহ ডেটা প্রেরণ করা এবং স্থান নষ্ট না করে তা বোঝায়। একটি পিপ্যাক্যাক মাত্র 16 বাইট আকারের হয় যখন একটি চিত্রগ্রন্থ 80 92 বাইট হয়। সুতরাং যখন কোনও বার্তাপ্রকরণের ভেরিয়েবলটি আরম্ভ করা হয় তখন এটির আকারের ক্ষেত্রটি সেট হয় এটি কোন ধরণের। এরপরে এটি অন্যান্য ফাংশন দ্বারা বাইটের সঠিক সংখ্যা স্থানান্তর করতে ব্যবহার করতে পারেন।


0

ইউনিয়নগুলি প্রোগ্রামটিতে কোনও মেশিনের স্বাধীন তথ্য এম্বেড না করে স্টোরেজের একক ক্ষেত্রে বিভিন্ন ধরণের ডেটা ম্যানিপুলেট করার একটি উপায় সরবরাহ করে তারা পাস্কলে বিভিন্ন রেকর্ডের সাথে সমান are

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

union u_tag {
     int ival;
     float fval;
     char  *sval;
} u;

ভেরিয়েবল আপনি তিন ধরণের বৃহত্তম ধারণ করতে যথেষ্ট বড় হবে; নির্দিষ্ট আকার বাস্তবায়ন নির্ভর dependent এই ধরণের যে কোনও একটি আপনাকে নির্ধারিত হতে পারে এবং তারপরে এক্সপ্রেশনগুলিতে ব্যবহার করা যেতে পারে, যতক্ষণ ব্যবহারের সাথে সামঞ্জস্য থাকে

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