নিষ্ক্রিয় ইউনিয়ন সদস্য এবং অনির্ধারিত আচরণ অ্যাক্সেস?


129

আমি এই ধারণার মধ্যে ছিলাম যে unionসর্বশেষ এক সেট ছাড়া অন্য কোনও সদস্যের অ্যাক্সেসটি ইউবি, তবে আমি কোনও শক্ত রেফারেন্স খুঁজে পাই না (এটির ইউবি দাবি করার উত্তরগুলি ছাড়াও তবে মানটির কোনও সমর্থন ছাড়াই)।

সুতরাং, এটি কি অপরিবর্তিত আচরণ?


3
C99 (এবং আমি বিশ্বাস করি যে C ++ 11 এছাড়াও) ইউনিয়নগুলির সাথে স্পষ্টভাবে টাইপ-পাঞ্চিংয়ের অনুমতি দেয়। সুতরাং আমি মনে করি এটি "বাস্তবায়ন সংজ্ঞায়িত" আচরণের আওতায় পড়ে।
রহস্যময়

1
আমি স্বতন্ত্র int থেকে চরে রূপান্তর করতে এটি বেশ কয়েকটি অনুষ্ঠানে ব্যবহার করেছি। সুতরাং, আমি অবশ্যই জানি এটি অপরিজ্ঞাত নয়। আমি এটি সান সিসি সংকলকটিতে ব্যবহার করেছি। সুতরাং, এটি এখনও সংকলক নির্ভরশীল হতে পারে।
Go4sri

42
@ Go4sri: স্পষ্টতই, আপনি জানেন না যে আচরণটির অপরিজ্ঞাত হওয়ার অর্থ কী। এটি যে কোনও ক্ষেত্রে আপনার পক্ষে কাজ করেছে বলে মনে হয়েছিল তা এর অপরিজ্ঞাততার বিরোধিতা করে না।
বেনজামিন লিন্ডলি


4
@ মিস্টিয়াল, আপনার লিঙ্ক করা ব্লগ পোস্টটি বিশেষভাবে C99 সম্পর্কিত; এই প্রশ্নটি কেবল সি ++ এর জন্য ট্যাগ করা আছে।
ডেভম্যাক

উত্তর:


131

বিভ্রান্তিটি হ'ল সি একটি ইউনিয়নের মাধ্যমে স্পষ্টভাবে টাইপ-পাঞ্জিংয়ের অনুমতি দেয়, তবে সি ++ () এরকম কোনও অনুমতি নেই।

.5.৫.২.৩ কাঠামো এবং ইউনিয়ন সদস্যগণ

৯৫) যদি কোন ইউনিয়ন অবজেক্টের বিষয়বস্তু পড়তে ব্যবহৃত সদস্য সদৃশ অবজেক্টে কোনও মূল্য সঞ্চয় করার জন্য ব্যবহৃত সদস্যের মতো না হয় তবে মানটির অবজেক্টের উপস্থাপনের উপযুক্ত অংশটি নতুনতে একটি উপস্থাপনের প্রতিনিধিত্ব হিসাবে পুনরায় ব্যাখ্যা করা হয় 6.2.6 এ বর্ণিত হিসাবে টাইপ করুন (এমন একটি প্রক্রিয়া যা কখনও কখনও '' টাইপ পেনিং '' নামে পরিচিত)) এটি একটি ফাঁদ উপস্থাপনা হতে পারে।

সি ++ এর সাথে পরিস্থিতি:

9.5 ইউনিয়ন [শ্রেণী. ইউনিয়ন]

একটি ইউনিয়নে, অ স্থিতিশীল ডেটা সদস্যদের মধ্যে সর্বাধিক একজন যেকোন সময় সক্রিয় হতে পারে, অর্থাৎ, অ স্থির ডেটা সদস্যদের সর্বাধিক একজনের মান যে কোনও সময় ইউনিয়নে সংরক্ষণ করা যেতে পারে।

সি ++ এর পরে structসাধারণ প্রাথমিক সিকোয়েন্স সহ ইউনিয়নগুলির ব্যবহারের অনুমতি দেওয়ার ভাষা রয়েছে ; এটি তবে টাইপ-পেনিংয়ের অনুমতি দেয় না।

নির্ধারণ ইউনিয়ন টাইপ-punning কিনা হয় সি অনুমতি ++ আমরা আরও অনুসন্ধান করতে হবে। মনে আছে সি ++ 11 এর জন্য আদর্শগত রেফারেন্স (এবং সি 99 এর ইউনিট টাইপ-পাঞ্জিংয়ের অনুমতি দেওয়া সি 11 এর সাথে একই ভাষা রয়েছে):

৩.৯ প্রকারগুলি [বেসিক.প্রকার]

৪ - টি টাইপ টির একটি অবজেক্টের উপস্থাপনা হ'ল এন স্বাক্ষরিত চরিত্রের অবজেক্টের ক্রম টি, যা টি টাইপ টি এর অবজেক্ট দ্বারা নেওয়া হয়, যেখানে এন সমান আকারের (টি) হয়। কোনও বস্তুর মান উপস্থাপনা হ'ল বিটের সেট যা টি টাইপের মান ধারণ করে tri তুচ্ছভাবে অনুলিপিযোগ্য প্রকারের জন্য, মূল্য উপস্থাপনের জন্য বস্তুর উপস্থাপনায় বিটগুলির একটি সেট যা একটি মান নির্ধারণ করে, যা একটি প্রয়োগের একটি পৃথক উপাদান- মানগুলির সেট করুন। 42
42) উদ্দেশ্যটি হ'ল সি ++ এর মেমরি মডেল আইএসও / আইইসি 9899 প্রোগ্রামিং ভাষা সি এর সাথে সামঞ্জস্যপূর্ণ is

এটি পড়ার পরে এটি বিশেষ আকর্ষণীয় হয়ে ওঠে

৩.৮ আজীবন অবজেক্ট [বেসিক লাইফ]

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

সুতরাং কোনও ইউনিয়নে অন্তর্ভুক্ত একটি আদিম ধরণের (যা আইপসো ফ্যাক্টোটি তুচ্ছ সূচনা আছে), অবজেক্টের আজীবন কমপক্ষে ইউনিয়নের আজীবন অন্তর্ভুক্ত থাকে। এটি আমাদের প্রার্থনা করতে দেয়

৩.৯.২ যৌগিক প্রকার

টি টাইপের কোনও অবজেক্ট যদি কোনও ঠিকানা এ-তে অবস্থিত হয়, তবে সিভি টি * টাইপের একটি পয়েন্টার, যার মান ঠিকানা হ'ল সেই মানটি কীভাবে প্রাপ্ত হয়েছিল তা নির্বিশেষে object বস্তুটির দিকে নির্দেশ করতে বলা হয়।

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

৪.১ মূল্য-থেকে-মূল্যমান রূপান্তর [কনভলভালভাল]

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

তারপরে প্রশ্ন হ'ল কোনও অ্যাক্টিভ ইউনিয়ন সদস্য যে বস্তুটি সক্রিয় ইউনিয়ন সদস্যকে স্টোরেজ দ্বারা সূচনা করা হয়েছিল। আমি যতদূর বলতে পারি, এটি ঘটনা নয় এবং তাই যদিও:

  • একটি ইউনিয়ন charঅ্যারে স্টোরেজ এবং পিছনে অনুলিপি করা হয় (3.9: 2), বা
  • একটি ইউনিয়ন বায়ুক্রমে একই ধরণের অন্য ইউনিয়নে অনুলিপি করা হয় (3.9: 3), বা
  • আইএসও / আইসিসি 9899 (যতক্ষণ না এটি সংজ্ঞায়িত হয়) (3.9: 4 নোট 42) এর সাথে সঙ্গতিপূর্ণ একটি প্রোগ্রাম উপাদান দ্বারা একটি ইউনিয়ন ভাষার গণ্ডি অতিক্রম করতে পারে then

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

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


5
3.8 / 1 বলছে যে কোনও সামগ্রীর পুনঃব্যবহার করা হলে কোনও সামগ্রীর জীবনকাল শেষ হয়। এটি আমার কাছে ইঙ্গিত করে যে কোনও ইউনিয়নের জীবদ্দশায় অ-সক্রিয় সদস্য শেষ হয়ে গেছে কারণ সঞ্চিত সদস্যের জন্য এটির স্টোরেজ পুনরায় ব্যবহার করা হয়েছে। এর অর্থ হ'ল আপনি কীভাবে সদস্যটি ব্যবহার করবেন তা সীমাবদ্ধ (3.8 / 6)।
bames53

2
সেই ব্যাখ্যার অধীনে তারপর প্রতিটি বিট মেমরিতে একই সাথে সমস্ত ধরণের অবজেক্ট থাকে যা তুচ্ছভাবে প্রাথমিকভাবে পরিবর্তনযোগ্য হয় এবং যথাযথ প্রান্তিককরণ থাকে ... সুতরাং এর পরে যেকোনো অ-তুচ্ছভাবে আর্নিালাইজযোগ্য টাইপের জীবনকাল অবিলম্বে শেষ হয় কারণ এর স্টোরেজটি অন্য সমস্ত ধরণের জন্য পুনরায় ব্যবহার করা হয় ( এবং পুনরায় চালু করার কারণ তারা তুচ্ছভাবে প্রাথমিকভাবে পরিবর্তনযোগ্য নয়)?
bames53

3
৪.১ শব্দটি সম্পূর্ণ এবং সম্পূর্ণরূপে নষ্ট হয়ে গেছে এবং এরপরে পুনরায় লেখা হয়েছে। এটা তোলে পুরোপুরি বৈধ জিনিস সমস্ত প্রকারের অননুমোদিত: এটা কাস্টম অননুমোদিত memcpyবাস্তবায়ন (ব্যবহার বস্তু অ্যাক্সেস unsigned charlvalues), এটি ব্যবহারের অননুমোদিত *pপর int *p = 0; const int *const *pp = &p;(যদিও থেকে অন্তর্নিহিত রূপান্তর int**করার const int*const*বৈধ), এটা এমনকি অ্যাক্সেস অননুমোদিত cপর struct S s; const S &c = s;সিডাব্লুজি ইস্যু 616 । নতুন শব্দটি কি এটির অনুমতি দেয়? এছাড়াও [বেসিক.লভাল] রয়েছে।

2
@ অ্যামিনিফেরিয়াস: এটি অর্থবহ হয়ে উঠবে, যদিও &ইউনিয়ন সদস্যের সাথে প্রয়োগ করার সময় অ্যানারি অপারেটরটির অর্থ কী তা পরিষ্কার করতে হবে (এবং সি স্ট্যান্ডার্ডকে বিটিডব্লিউও বোঝাতে হবে) । আমি মনে করি ফলস্বরূপ পয়েন্টারটি সদস্যের অ্যাক্সেসের জন্য কমপক্ষে পরবর্তী সময় পর্যন্ত অন্য কোনও সদস্য লভ্যালুয়ের প্রত্যক্ষ বা অপ্রত্যক্ষভাবে ব্যবহারের ক্ষেত্রে ব্যবহারযোগ্য হওয়া উচিত, তবে জিসিসিতে পয়েন্টারটি এত দীর্ঘ এমনকি ব্যবহারযোগ্য নয়, যা একটি প্রশ্ন উত্থাপন করে &অপারেটর গড় অনুমিত হয়।
সুপারক্যাট

4
"মনে রাখবেন যে সি 99+ সি ++ 11 এর জন্য একটি আদর্শিক রেফারেন্স" সম্পর্কিত একটি প্রশ্ন "এটি কি কেবল প্রাসঙ্গিক নয়, যেখানে সি ++ স্ট্যান্ডার্ড স্পষ্টভাবে সি স্ট্যান্ডার্ডকে বোঝায় (যেমন সি লাইব্রেরির ফাংশনগুলির জন্য)?
মাইক এমবি

28

সি ++ 11 স্ট্যান্ডার্ড এটিকে বলে

9.5 ইউনিয়ন

একটি ইউনিয়নে, অ স্থিতিশীল ডেটা সদস্যদের মধ্যে সর্বাধিক একজন যেকোন সময় সক্রিয় হতে পারে, অর্থাৎ, অ স্থির ডেটা সদস্যদের সর্বাধিক একজনের মান যে কোনও সময় ইউনিয়নে সংরক্ষণ করা যেতে পারে।

যদি কেবল একটি মান সংরক্ষণ করা হয় তবে আপনি কীভাবে অন্যটি পড়তে পারেন? এটা ঠিক সেখানে নেই।


Gcc ডকুমেন্টেশন এটিকে বাস্তবায়ন সংজ্ঞায়িত আচরণের অধীনে তালিকাভুক্ত করে

  • ইউনিয়ন অবজেক্টের সদস্যকে বিভিন্ন ধরণের (C90 6.3.2.3) সদস্য ব্যবহার করে অ্যাক্সেস করা হয়।

অবজেক্টের উপস্থাপনের প্রাসঙ্গিক বাইটগুলি অ্যাক্সেসের জন্য ব্যবহৃত ধরণের একটি অবজেক্ট হিসাবে বিবেচনা করা হয়। টাইপ-পেনিং দেখুন। এটি একটি ফাঁদ উপস্থাপনা হতে পারে।

এটি সি মানক দ্বারা প্রয়োজনীয় নয় তা নির্দেশ করে।


2016-01-05: মন্তব্যের মাধ্যমে আমি সি 99 ত্রুটি প্রতিবেদন # 283 এর সাথে যুক্ত ছিল যা সি স্ট্যান্ডার্ড ডকুমেন্টের পাদটীকা হিসাবে একটি অনুরূপ পাঠ্য যুক্ত করেছে:

A 78 ক) ইউনিয়ন অবজেক্টের বিষয়বস্তুগুলি অ্যাক্সেস করতে ব্যবহৃত সদস্য যদি সর্বশেষে কোনও বস্তুতে কোনও মূল্য সঞ্চয় করার জন্য ব্যবহৃত সদস্যের মতো না হয় তবে মানটির অবজেক্টের উপস্থাপনের উপযুক্ত অংশটি নতুনতে একটি উপস্থাপনের প্রতিনিধিত্ব হিসাবে পুনরায় ব্যাখ্যা করা হয় 6.2.6 এ বর্ণিত হিসাবে টাইপ করুন (এমন একটি প্রক্রিয়া যা কখনও কখনও "টাইপ পেনিং" নামে পরিচিত)। এটি একটি ফাঁদ উপস্থাপনা হতে পারে।

এটি যদিও খুব বেশি স্পষ্ট করে তা নিশ্চিত নন, পাদটীকা মানটির জন্য আদর্শ নয় considering


10
@ লুচিয়ানগ্রিগোর: ইউবি স্ট্যান্ডার্ড যা বলে ইউবি তা নয়, পরিবর্তে এটি কীভাবে কাজ করা উচিত তা স্ট্যান্ডার্ডটি বর্ণনা করে না। এটি ঠিক এ জাতীয় ঘটনা। স্ট্যান্ডার্ড কি হয় তা বর্ণনা করে? এটি কি বলে যে এটি বাস্তবায়ন সংজ্ঞায়িত হয়েছে? না এবং না। সুতরাং এটি ইউবি। তদ্ব্যতীত, "সদস্যরা একই মেমরি ঠিকানা ভাগ করে দেয়" যুক্তি সম্পর্কিত, আপনাকে আলিয়াসিং বিধিগুলি উল্লেখ করতে হবে, যা আপনাকে আবার ইউবিতে নিয়ে আসবে।
ইয়াকভ গালকা

5
@ লুচিয়ান: এটি সক্রিয় মানে কী তা সম্পূর্ণরূপে পরিষ্কার, "অর্থাত্ অ স্থায়ী ডেটা সদস্যদের মধ্যে একটির মান একটি ইউনিয়নে যে কোনও সময় সংরক্ষণ করা যেতে পারে" "
বেনজামিন লিন্ডলি

5
@ লুচিয়ানগ্রিগোর: হ্যাঁ আছে। এখানে অসীম পরিমাণে কেস রয়েছে যা মানক ঠিকানা দেয় না (এবং করতে পারে না)। (সি ++ একটি টিউরিং সম্পূর্ণ ভিএম তাই এটি অসম্পূর্ণ)) তাহলে কী? এটি "সক্রিয়" এর অর্থ কী তা বোঝায় না, উপরোক্ত উদ্ধৃতিটি "পরে" উল্লেখ করুন।
ইয়াকভ গালকা

8
@ লুচিয়ানগ্রিগোর: সংজ্ঞা বিভাগ অনুযায়ী আচরণের সুস্পষ্ট সংজ্ঞা গ্রহণের বিষয়টিও অনির্ধারিত অপরিজ্ঞাত আচরণ।
jxh

5
@ ক্লাউডিউ এটি অন্য কারণে ভিন্ন ইউবি - এটি কঠোরভাবে আলিয়াজিং লঙ্ঘন করে।
রহস্যময়

18

আমি মনে করি নিকটতম মানটি এটির অপরিবর্তিত আচরণ বলে চলে আসে যেখানে এটি একটি সাধারণ প্রাথমিক ক্রম (সি 99, §6.5.2.3 / 5) সমন্বিত ইউনিয়নের জন্য আচরণটি সংজ্ঞায়িত করে:

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

সি ++ 11 § 9.2 / 19 এ অনুরূপ প্রয়োজনীয়তা / অনুমতি দেয়:

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

যদিও উভয়ই সরাসরি এটি বর্ণনা করে না, উভয়ই দৃ a়ভাবে বোঝায় যে কোনও সদস্যকে "পরিদর্শন" (পড়া) কেবলমাত্র "অনুমোদিত" যদি 1) এটা (অংশ) সদস্য সম্প্রতি লেখা বা 2) একটি সাধারণ প্রারম্ভিক অংশ ক্রম.

এটি সরাসরি বক্তব্য নয় যে অন্যথায় করা আচরণের সংজ্ঞায়িত আচরণ নয়, তবে এটি সবচেয়ে কাছের যেটি আমি সচেতন।


এটি সম্পূর্ণ করার জন্য, আপনাকে জানতে হবে যে "লেআউট-সামঞ্জস্যপূর্ণ প্রকারগুলি" সি ++ এর জন্য কী, বা "সামঞ্জস্যপূর্ণ প্রকার" সি এর জন্য কী
মাইকেল অ্যান্ডারসন

2
@ মাইকেল অ্যান্ডারসন: হ্যাঁ এবং না। এই ব্যতিক্রমগুলির মধ্যে কিছু পড়ে কিনা আপনি যখন নিশ্চিত হতে চান তবে তাদের সাথে আপনার আচরণ করা দরকার - তবে এখানে আসল প্রশ্নটি ব্যতিক্রমের বাইরে স্পষ্টভাবে পড়ে এমন কিছু সত্যই ইউবি দেয় কিনা তা এখানে রয়েছে। আমি মনে করি যে উদ্দেশ্যটি পরিষ্কার করার জন্য এটি যথেষ্ট দৃ .়ভাবে জড়িত, তবে আমি কখনও মনে করি না যে এটি সরাসরি বলা হয়েছে।
জেরি কফিন

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

@JerryCoffin, আমি মনে করি তুমি আমাকে যেমন একই প্রশ্ন এ hinting হয়েছে: কি আমাদের যদি unionথাকে যেমন একটি uint8_tএবং একটি class Something { uint8_t myByte; [...] };- আমি এই অনুবিধি এখানে প্রযোজ্য হবে অনুমান করা হবে, কিন্তু এটা খুবই ইচ্ছাকৃতভাবে শুধুমাত্র অনুমতি ভাষায় এর structগুলি। ভাগ্যক্রমে আমি ইতিমধ্যে কাঁচা আদিমগুলির পরিবর্তে সেগুলি ব্যবহার করছি: হে
আন্ডারস্কোর_১১

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

12

Available.২.৫ অনুচ্ছেদের ২১ অনুচ্ছেদে পাদটীকাগুলি ৩ 37: উপলব্ধ উত্তরগুলির দ্বারা এখনও উল্লেখ করা হয়নি:

নোট করুন যে সমষ্টিগত টাইপটিতে ইউনিয়ন প্রকার অন্তর্ভুক্ত নয় কারণ ইউনিয়ন প্রকারযুক্ত একটি সামগ্রীতে কেবলমাত্র একবারে একজন সদস্য থাকতে পারে।

এই প্রয়োজনীয়তাটি স্পষ্টভাবে বোঝাচ্ছে যে আপনাকে অবশ্যই কোনও সদস্যকে লিখতে হবে না এবং অন্য কোনওটিতে পড়তে হবে না। এক্ষেত্রে নির্দিষ্টকরণের অভাবে এটি অপরিজ্ঞাত আচরণ হতে পারে।


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

-3

আমি একটি উদাহরণ দিয়ে এটি ভাল ব্যাখ্যা।
ধরুন আমাদের নিম্নলিখিত ইউনিয়ন রয়েছে:

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 (দশমিক ক্ষেত্রে) এ পরিণত করবে।

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


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