নিম্নলিখিত তিনটি বিবেচনা করুন struct
:
class blub {
int i;
char c;
blub(const blub&) {}
};
class blob {
char s;
blob(const blob&) {}
};
struct bla {
blub b0;
blob b1;
};
সাধারণ প্ল্যাটফর্মগুলিতে যেখানে int
4 বাইট রয়েছে, আকারগুলি, প্রান্তিককরণ এবং মোট প্যাডিং 1 নিম্নরূপ:
struct size alignment padding
-------- ------ ----------- ---------
blub 8 4 3
blob 1 1 0
bla 12 4 6
blub
এবং blob
সদস্যদের স্টোরেজের মধ্যে কোনও ওভারল্যাপ নেই , যদিও আকার 1 blob
নীতিগতভাবে প্যাডিংয়ে "ফিট" হতে পারেblub
।
সি ++ 20 no_unique_address
গুণটি উপস্থাপন করে যা সংলগ্ন খালি সদস্যদের একই ঠিকানা ভাগ করে নেওয়ার অনুমতি দেয়। এটি কোনও সদস্যের প্যাডিং ব্যবহার করে অন্য ব্যক্তিকে উপরে রাখার জন্য উপরে বর্ণিত দৃশ্যের স্পষ্টভাবে মঞ্জুরি দেয়। থেকে cppreference (জোর খনি):
ইঙ্গিত করে যে এই ডেটা সদস্যটির কোনও শ্রেণীর অন্যান্য অ-স্থিতিশীল ডেটা সদস্যদের থেকে পৃথক কোনও ঠিকানা প্রয়োজন নেই। এর অর্থ হল যে সদস্যটির যদি খালি প্রকার থাকে (যেমন: রাষ্ট্রবিহীন অ্যালোকেটর), সংকলকটি কোনও স্থান দখল করতে এটি অনুকূলিত করতে পারে, ঠিক যেমন এটি একটি খালি বেস ছিল। সদস্য যদি খালি না থাকে তবে এতে কোনও লেজ প্যাডিং অন্য ডেটা সদস্যদের সঞ্চয় করতে পুনরায় ব্যবহার করা যেতে পারে।
প্রকৃতপক্ষে, আমরা যদি এই বৈশিষ্ট্য ব্যবহার blub b0
, মাপ bla
করতে ঝরিয়া 8
, তাই blob
প্রকৃতপক্ষে মধ্যে সংরক্ষিত হয় blub
godbolt দেখা যেমন ।
অবশেষে, আমরা আমার প্রশ্নে উঠি:
সাধারণ মানের কোনও পাঠ্য (C ++ 11 এর মাধ্যমে C ++ 20) এই ওভারল্যাপিংটি ছাড়াই বাধা দেয় no_unique_address
, তুচ্ছভাবে অনুলিপিযোগ্য নয় এমন বস্তুর জন্য?
আমাকে উপরের থেকে তুচ্ছ কপিযোগ্য (টিসি) অবজেক্টগুলি বাদ দিতে হবে, কারণ টিসি অবজেক্টের জন্য std::memcpy
, সদস্য সাবোবজেক্টস সহ এটি একটি বস্তু থেকে অন্য বস্তুর কাছে অনুমতি দেওয়া হয় এবং স্টোরেজটি যদি ওভারল্যাপ করা থাকে তবে এটি ভাঙবে (কারণ সমস্ত বা স্টোরেজের অংশটি) সংলগ্ন সদস্যের জন্য ওভাররাইট করা হবে) 2 ।
1 আমরা প্যাডিংকে পুনরাবৃত্তভাবে কাঠামোর আকার এবং এর সমস্ত উপাদান সদস্যের আকারের মধ্যে পার্থক্য হিসাবে গণনা করি।
2 এ কারণেই আমার কাছে অনুলিপি নির্ধারক রয়েছে: তুচ্ছভাবে অনুলিপিযোগ্য করাblub
ও তৈরি করা যায় blob
না ।