আমি এই ধারণার মধ্যে ছিলাম যে union
সর্বশেষ এক সেট ছাড়া অন্য কোনও সদস্যের অ্যাক্সেসটি ইউবি, তবে আমি কোনও শক্ত রেফারেন্স খুঁজে পাই না (এটির ইউবি দাবি করার উত্তরগুলি ছাড়াও তবে মানটির কোনও সমর্থন ছাড়াই)।
সুতরাং, এটি কি অপরিবর্তিত আচরণ?
আমি এই ধারণার মধ্যে ছিলাম যে union
সর্বশেষ এক সেট ছাড়া অন্য কোনও সদস্যের অ্যাক্সেসটি ইউবি, তবে আমি কোনও শক্ত রেফারেন্স খুঁজে পাই না (এটির ইউবি দাবি করার উত্তরগুলি ছাড়াও তবে মানটির কোনও সমর্থন ছাড়াই)।
সুতরাং, এটি কি অপরিবর্তিত আচরণ?
উত্তর:
বিভ্রান্তিটি হ'ল সি একটি ইউনিয়নের মাধ্যমে স্পষ্টভাবে টাইপ-পাঞ্জিংয়ের অনুমতি দেয়, তবে সি ++ (C ++ 11) এরকম কোনও অনুমতি নেই।
.5.৫.২.৩ কাঠামো এবং ইউনিয়ন সদস্যগণ
৯৫) যদি কোন ইউনিয়ন অবজেক্টের বিষয়বস্তু পড়তে ব্যবহৃত সদস্য সদৃশ অবজেক্টে কোনও মূল্য সঞ্চয় করার জন্য ব্যবহৃত সদস্যের মতো না হয় তবে মানটির অবজেক্টের উপস্থাপনের উপযুক্ত অংশটি নতুনতে একটি উপস্থাপনের প্রতিনিধিত্ব হিসাবে পুনরায় ব্যাখ্যা করা হয় 6.2.6 এ বর্ণিত হিসাবে টাইপ করুন (এমন একটি প্রক্রিয়া যা কখনও কখনও '' টাইপ পেনিং '' নামে পরিচিত)) এটি একটি ফাঁদ উপস্থাপনা হতে পারে।
সি ++ এর সাথে পরিস্থিতি:
9.5 ইউনিয়ন [শ্রেণী. ইউনিয়ন]
একটি ইউনিয়নে, অ স্থিতিশীল ডেটা সদস্যদের মধ্যে সর্বাধিক একজন যেকোন সময় সক্রিয় হতে পারে, অর্থাৎ, অ স্থির ডেটা সদস্যদের সর্বাধিক একজনের মান যে কোনও সময় ইউনিয়নে সংরক্ষণ করা যেতে পারে।
সি ++ এর পরে struct
সাধারণ প্রাথমিক সিকোয়েন্স সহ ইউনিয়নগুলির ব্যবহারের অনুমতি দেওয়ার ভাষা রয়েছে ; এটি তবে টাইপ-পেনিংয়ের অনুমতি দেয় না।
নির্ধারণ ইউনিয়ন টাইপ-punning কিনা হয় সি অনুমতি ++ আমরা আরও অনুসন্ধান করতে হবে। মনে আছেC99 সি ++ 11 এর জন্য আদর্শগত রেফারেন্স (এবং সি 99 এর ইউনিট টাইপ-পাঞ্জিংয়ের অনুমতি দেওয়া সি 11 এর সাথে একই ভাষা রয়েছে):
৩.৯ প্রকারগুলি [বেসিক.প্রকার]
৪ - টি টাইপ টির একটি অবজেক্টের উপস্থাপনা হ'ল এন স্বাক্ষরিত চরিত্রের অবজেক্টের ক্রম টি, যা টি টাইপ টি এর অবজেক্ট দ্বারা নেওয়া হয়, যেখানে এন সমান আকারের (টি) হয়। কোনও বস্তুর মান উপস্থাপনা হ'ল বিটের সেট যা টি টাইপের মান ধারণ করে tri তুচ্ছভাবে অনুলিপিযোগ্য প্রকারের জন্য, মূল্য উপস্থাপনের জন্য বস্তুর উপস্থাপনায় বিটগুলির একটি সেট যা একটি মান নির্ধারণ করে, যা একটি প্রয়োগের একটি পৃথক উপাদান- মানগুলির সেট করুন। 42
42) উদ্দেশ্যটি হ'ল সি ++ এর মেমরি মডেল আইএসও / আইইসি 9899 প্রোগ্রামিং ভাষা সি এর সাথে সামঞ্জস্যপূর্ণ is
এটি পড়ার পরে এটি বিশেষ আকর্ষণীয় হয়ে ওঠে
৩.৮ আজীবন অবজেক্ট [বেসিক লাইফ]
টাইপ টি-এর একটি অবজেক্টের জীবনকাল শুরু হয় যখন: - টি টাইপ টির জন্য সঠিক প্রান্তিককরণ এবং আকারের সাথে স্টোরেজ পাওয়া যায় এবং - যদি অবজেক্টটি অ-তুচ্ছ প্রাথমিক শুরু করে থাকে তবে এর সূচনাটি সম্পূর্ণ হয়।
সুতরাং কোনও ইউনিয়নে অন্তর্ভুক্ত একটি আদিম ধরণের (যা আইপসো ফ্যাক্টোটি তুচ্ছ সূচনা আছে), অবজেক্টের আজীবন কমপক্ষে ইউনিয়নের আজীবন অন্তর্ভুক্ত থাকে। এটি আমাদের প্রার্থনা করতে দেয়
৩.৯.২ যৌগিক প্রকার
টি টাইপের কোনও অবজেক্ট যদি কোনও ঠিকানা এ-তে অবস্থিত হয়, তবে সিভি টি * টাইপের একটি পয়েন্টার, যার মান ঠিকানা হ'ল সেই মানটি কীভাবে প্রাপ্ত হয়েছিল তা নির্বিশেষে object বস্তুটির দিকে নির্দেশ করতে বলা হয়।
ধরে নিই যে আমরা যে অপারেশনে আগ্রহী তা টাইপ-পেনিং অর্থাত্ একটি অ-সক্রিয় ইউনিয়ন সদস্যের মূল্য গ্রহণ করা এবং উপরোক্ত অনুসারে দেওয়া হয়েছে যে সেই সদস্যের দ্বারা বর্ণিত বস্তুর আমাদের কাছে বৈধ রেফারেন্স রয়েছে, সেই অপারেশনটি মূল্যবান -মূল্য রূপান্তর:
৪.১ মূল্য-থেকে-মূল্যমান রূপান্তর [কনভলভালভাল]
একটি অ-ফাংশন, নন-অ্যারে টাইপের
T
একটি গ্লাভ একটি মূল্যায় রূপান্তর করা যেতে পারে। যদিT
কোনও অসম্পূর্ণ প্রকার হয়, এমন একটি প্রোগ্রাম যা এই রূপান্তরটির প্রয়োজন হয় তা দুর্নীতিগ্রস্ত। গ্লাভ্যুটি যে বস্তুর প্রতি নির্দেশ করে তা যদি কোনও ধরণের অবজেক্টT
না হয় এবং সেখান থেকে প্রাপ্ত কোনও ধরণের অবজেক্ট না হয় বা অবজেক্টটি অনির্বাচিত করা হয়T
তবে এই রূপান্তরটির প্রয়োজন এমন একটি প্রোগ্রামের অকারণে আচরণ রয়েছে।
তারপরে প্রশ্ন হ'ল কোনও অ্যাক্টিভ ইউনিয়ন সদস্য যে বস্তুটি সক্রিয় ইউনিয়ন সদস্যকে স্টোরেজ দ্বারা সূচনা করা হয়েছিল। আমি যতদূর বলতে পারি, এটি ঘটনা নয় এবং তাই যদিও:
char
অ্যারে স্টোরেজ এবং পিছনে অনুলিপি করা হয় (3.9: 2), বাঅ-সক্রিয় সদস্যের দ্বারা ইউনিয়নে অ্যাক্সেস সংজ্ঞায়িত করা হয় এবং এটি অবজেক্ট এবং মান উপস্থাপনাকে অনুসরণ করতে সংজ্ঞায়িত হয়, উপরের ইন্টারপজিশনগুলির একটি ছাড়াই অ্যাক্সেস অপরিজ্ঞাত আচরণ। এটি যেমন একটি প্রোগ্রামে সঞ্চালনের অনুমতি দেওয়া অপটিমাইজেশনগুলির জন্য এর জড়িত থাকে, কারণ বাস্তবায়ন অবশ্যই ধরে নিতে পারে যে অনির্ধারিত আচরণ ঘটে না।
এটি হ'ল যদিও আমরা বৈধভাবে একটি অ-সক্রিয় ইউনিয়ন সদস্যকে একটি মূল্যায়ন করতে পারি (এজন্য নির্মাণ ব্যতীত অ-সক্রিয় সদস্যকে অর্পণ করা ঠিক আছে) এটি অবিবেচনাযুক্ত বলে মনে করা হয়।
memcpy
বাস্তবায়ন (ব্যবহার বস্তু অ্যাক্সেস unsigned char
lvalues), এটি ব্যবহারের অননুমোদিত *p
পর int *p = 0; const int *const *pp = &p;
(যদিও থেকে অন্তর্নিহিত রূপান্তর int**
করার const int*const*
বৈধ), এটা এমনকি অ্যাক্সেস অননুমোদিত c
পর struct S s; const S &c = s;
। সিডাব্লুজি ইস্যু 616 । নতুন শব্দটি কি এটির অনুমতি দেয়? এছাড়াও [বেসিক.লভাল] রয়েছে।
&
ইউনিয়ন সদস্যের সাথে প্রয়োগ করার সময় অ্যানারি অপারেটরটির অর্থ কী তা পরিষ্কার করতে হবে (এবং সি স্ট্যান্ডার্ডকে বিটিডব্লিউও বোঝাতে হবে) । আমি মনে করি ফলস্বরূপ পয়েন্টারটি সদস্যের অ্যাক্সেসের জন্য কমপক্ষে পরবর্তী সময় পর্যন্ত অন্য কোনও সদস্য লভ্যালুয়ের প্রত্যক্ষ বা অপ্রত্যক্ষভাবে ব্যবহারের ক্ষেত্রে ব্যবহারযোগ্য হওয়া উচিত, তবে জিসিসিতে পয়েন্টারটি এত দীর্ঘ এমনকি ব্যবহারযোগ্য নয়, যা একটি প্রশ্ন উত্থাপন করে &
অপারেটর গড় অনুমিত হয়।
সি ++ 11 স্ট্যান্ডার্ড এটিকে বলে
9.5 ইউনিয়ন
একটি ইউনিয়নে, অ স্থিতিশীল ডেটা সদস্যদের মধ্যে সর্বাধিক একজন যেকোন সময় সক্রিয় হতে পারে, অর্থাৎ, অ স্থির ডেটা সদস্যদের সর্বাধিক একজনের মান যে কোনও সময় ইউনিয়নে সংরক্ষণ করা যেতে পারে।
যদি কেবল একটি মান সংরক্ষণ করা হয় তবে আপনি কীভাবে অন্যটি পড়তে পারেন? এটা ঠিক সেখানে নেই।
Gcc ডকুমেন্টেশন এটিকে বাস্তবায়ন সংজ্ঞায়িত আচরণের অধীনে তালিকাভুক্ত করে
- ইউনিয়ন অবজেক্টের সদস্যকে বিভিন্ন ধরণের (C90 6.3.2.3) সদস্য ব্যবহার করে অ্যাক্সেস করা হয়।
অবজেক্টের উপস্থাপনের প্রাসঙ্গিক বাইটগুলি অ্যাক্সেসের জন্য ব্যবহৃত ধরণের একটি অবজেক্ট হিসাবে বিবেচনা করা হয়। টাইপ-পেনিং দেখুন। এটি একটি ফাঁদ উপস্থাপনা হতে পারে।
এটি সি মানক দ্বারা প্রয়োজনীয় নয় তা নির্দেশ করে।
2016-01-05: মন্তব্যের মাধ্যমে আমি সি 99 ত্রুটি প্রতিবেদন # 283 এর সাথে যুক্ত ছিল যা সি স্ট্যান্ডার্ড ডকুমেন্টের পাদটীকা হিসাবে একটি অনুরূপ পাঠ্য যুক্ত করেছে:
A 78 ক) ইউনিয়ন অবজেক্টের বিষয়বস্তুগুলি অ্যাক্সেস করতে ব্যবহৃত সদস্য যদি সর্বশেষে কোনও বস্তুতে কোনও মূল্য সঞ্চয় করার জন্য ব্যবহৃত সদস্যের মতো না হয় তবে মানটির অবজেক্টের উপস্থাপনের উপযুক্ত অংশটি নতুনতে একটি উপস্থাপনের প্রতিনিধিত্ব হিসাবে পুনরায় ব্যাখ্যা করা হয় 6.2.6 এ বর্ণিত হিসাবে টাইপ করুন (এমন একটি প্রক্রিয়া যা কখনও কখনও "টাইপ পেনিং" নামে পরিচিত)। এটি একটি ফাঁদ উপস্থাপনা হতে পারে।
এটি যদিও খুব বেশি স্পষ্ট করে তা নিশ্চিত নন, পাদটীকা মানটির জন্য আদর্শ নয় considering
আমি মনে করি নিকটতম মানটি এটির অপরিবর্তিত আচরণ বলে চলে আসে যেখানে এটি একটি সাধারণ প্রাথমিক ক্রম (সি 99, §6.5.2.3 / 5) সমন্বিত ইউনিয়নের জন্য আচরণটি সংজ্ঞায়িত করে:
ইউনিয়নের ব্যবহারকে সহজ করার জন্য একটি বিশেষ গ্যারান্টি দেওয়া হয়: যদি কোনও ইউনিয়নে প্রচলিত প্রাথমিক কাঠামো ভাগ করে এমন কয়েকটি কাঠামো থাকে (নীচে দেখুন), এবং ইউনিয়ন অবজেক্টে বর্তমানে এই কাঠামোর মধ্যে একটি রয়েছে, তবে এটি সাধারণ পরিদর্শন করার অনুমতি দেওয়া হয় এগুলির যে কোনও একটির প্রাথমিক অংশ যা ইউনিয়নের সম্পূর্ণ ধরণের ঘোষণা দৃশ্যমান। দুটি কাঠামোগত একটি সাধারণ প্রাথমিক ক্রম ভাগ করে যদি সংশ্লিষ্ট সদস্যদের এক বা একাধিক প্রাথমিক সদস্যের অনুক্রমের জন্য সামঞ্জস্যপূর্ণ প্রকারগুলি (এবং বিট-ফিল্ডগুলির জন্য একই প্রস্থের জন্য) থাকে।
সি ++ 11 § 9.2 / 19 এ অনুরূপ প্রয়োজনীয়তা / অনুমতি দেয়:
যদি একটি স্ট্যান্ডার্ড-লেআউট ইউনিয়নে দুটি বা ততোধিক স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট থাকে যা একটি সাধারণ প্রাথমিক ক্রম ভাগ করে দেয় এবং যদি বর্তমানে স্ট্যান্ডার্ড-লেআউট ইউনিয়ন অবজেক্টে এই স্ট্যান্ডার্ড-লেআউট স্ট্রাকগুলির মধ্যে একটি থাকে তবে এটির যে কোনও একটি সাধারণ প্রাথমিক অংশটি খতিয়ে দেখার অনুমতি রয়েছে তাদের মধ্যে. দুটি স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট একটি সাধারণ প্রাথমিক ক্রম ভাগ করে যদি সংশ্লিষ্ট সদস্যদের বিন্যাস-সামঞ্জস্যপূর্ণ প্রকার থাকে এবং উভয় সদস্যই বিট-ফিল্ড হয় না বা উভয়ই এক বা একাধিক প্রাথমিক সদস্যের অনুক্রমের জন্য একই প্রস্থের বিট-ক্ষেত্র হয়।
যদিও উভয়ই সরাসরি এটি বর্ণনা করে না, উভয়ই দৃ a়ভাবে বোঝায় যে কোনও সদস্যকে "পরিদর্শন" (পড়া) কেবলমাত্র "অনুমোদিত" যদি 1) এটা (অংশ) সদস্য সম্প্রতি লেখা বা 2) একটি সাধারণ প্রারম্ভিক অংশ ক্রম.
এটি সরাসরি বক্তব্য নয় যে অন্যথায় করা আচরণের সংজ্ঞায়িত আচরণ নয়, তবে এটি সবচেয়ে কাছের যেটি আমি সচেতন।
union
যেহেতু আমাকে একটি নির্দিষ্ট ব্লগের দ্বারা এই ধারণাটি দেওয়া হয়েছিল যে এটি ঠিক আছে, এবং এর চারপাশে বেশ কয়েকটি বৃহত কাঠামো এবং প্রকল্পগুলি নির্মিত হয়েছিল। এখন আমি মনে করি আমি সম্ভবত ঠিক আছি, যেহেতু আমার union
union
থাকে যেমন একটি uint8_t
এবং একটি class Something { uint8_t myByte; [...] };
- আমি এই অনুবিধি এখানে প্রযোজ্য হবে অনুমান করা হবে, কিন্তু এটা খুবই ইচ্ছাকৃতভাবে শুধুমাত্র অনুমতি ভাষায় এর struct
গুলি। ভাগ্যক্রমে আমি ইতিমধ্যে কাঁচা আদিমগুলির পরিবর্তে সেগুলি ব্যবহার করছি: হে
Available.২.৫ অনুচ্ছেদের ২১ অনুচ্ছেদে পাদটীকাগুলি ৩ 37: উপলব্ধ উত্তরগুলির দ্বারা এখনও উল্লেখ করা হয়নি:
নোট করুন যে সমষ্টিগত টাইপটিতে ইউনিয়ন প্রকার অন্তর্ভুক্ত নয় কারণ ইউনিয়ন প্রকারযুক্ত একটি সামগ্রীতে কেবলমাত্র একবারে একজন সদস্য থাকতে পারে।
এই প্রয়োজনীয়তাটি স্পষ্টভাবে বোঝাচ্ছে যে আপনাকে অবশ্যই কোনও সদস্যকে লিখতে হবে না এবং অন্য কোনওটিতে পড়তে হবে না। এক্ষেত্রে নির্দিষ্টকরণের অভাবে এটি অপরিজ্ঞাত আচরণ হতে পারে।
আমি একটি উদাহরণ দিয়ে এটি ভাল ব্যাখ্যা।
ধরুন আমাদের নিম্নলিখিত ইউনিয়ন রয়েছে:
union A{
int x;
short y[2];
};
আমি ভালভাবে ধরে নিলাম যে sizeof(int)
4 দেয়, এবং এটি sizeof(short)
2 দেয়
যখন আপনি union A a = {10}
ভাল করে লেখেন তখন এটিতে 10 এর মান লিখুন এ টাইপের একটি নতুন ধরণের তৈরি করুন।
আপনার স্মৃতিটি দেখতে এমন হওয়া উচিত: (মনে রাখবেন যে ইউনিয়নের সদস্যরা সবাই একই অবস্থান পান)
| এক্স | | y [0] | y [1] | ----------------------------------------- a-> | 0000 0000 | 0000 0000 | 0000 0000 | 0000 1010 | -----------------------------------------
যেমন আপনি দেখতে পাচ্ছিলেন, কুড়ালটির মান 10, আই 1 এর মান 10 এবং আয়ের মান 0 হয় 0
এখন, আমি যদি এটি করি তবে ভাল কি হবে?
a.y[0] = 37;
আমাদের স্মৃতি এটিকে দেখতে পাবেন:
| এক্স | | y [0] | y [1] | ----------------------------------------- a-> | 0000 0000 | 0010 0101 | 0000 0000 | 0000 1010 | -----------------------------------------
এটি কুঠার মানকে 2424842 (দশমিক ক্ষেত্রে) এ পরিণত করবে।
এখন, যদি আপনার ইউনিয়নে একটি ভাসমান বা দ্বিগুণ থাকে তবে আপনার সঠিক নম্বরগুলি সংরক্ষণ করার কারণে আপনার মেমরির মানচিত্রটি আরও খারাপ হতে পারে। আপনি এখানে পেতে পারে আরও তথ্য ।