ক্লাসে সংলগ্ন সদস্যদের ওভারল্যাপিং রোধ করে কী?


12

নিম্নলিখিত তিনটি বিবেচনা করুন struct:

class blub {
    int i;
    char c;

    blub(const blub&) {}
};

class blob {
    char s;

    blob(const blob&) {}
};

struct bla {
    blub b0;
    blob b1;
};

সাধারণ প্ল্যাটফর্মগুলিতে যেখানে int4 বাইট রয়েছে, আকারগুলি, প্রান্তিককরণ এবং মোট প্যাডিং 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না ।


আমি এটি গবেষণা করেছি না, তবে আমি "যদি" বিধি অনুমান করছি । যদি বিমূর্ত মেশিনে কোনও পর্যবেক্ষণযোগ্য পার্থক্য (খুব নির্দিষ্ট অর্থ বিটিডাব্লু সহ একটি শব্দ) না থাকে (যা আপনার কোডটির বিপরীতে সংকলিত হয়) তবে সংকলক কোডটি পছন্দ করতে পারে তবে এটি পছন্দ করতে পারে।
জেস্পার জুহল 22:25

: চমত্কার নিশ্চিত এই একটি প্রতারিত হয় stackoverflow.com/questions/53837373/...
NathanOliver

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

1
@ বিঅনরোপ আমি আপনার প্রশ্নের উত্তর দিতে পারি না, দুঃখিত। যে কারণে আমি একটি মন্তব্য পোস্ট করেছি এবং একটি উত্তর নেই। এই মন্তব্যে আপনি যা পেয়েছেন তা আমার ব্যাখ্যার পক্ষে সবচেয়ে ভাল অনুমান, তবে আমি উত্তরটি জানি না (এটি নিজে শিখতে আগ্রহী - যার কারণে আপনি একটি উত্সাহ পেয়েছিলেন)।
জেস্পার জুহল

1
@ নিকলবোলাস - আপনি কি সঠিক প্রশ্নের জবাব দিচ্ছেন? এটি নিরাপদ অনুলিপি বা অন্য কিছু সনাক্ত করার বিষয়ে নয়। বরং আমি কৌতূহল যে কেন প্যাডিং সদস্যদের মধ্যে পুনরায় ব্যবহার করা যাবে না। যাই হোক, আপনি ভুল: জাভাস্ক্রিপ্টে গার্বেজ copyable একটি হল টাইপ সম্পত্তি এবং সবসময় হয়েছে। যাইহোক, নিরাপদে একটি বস্তু অনুলিপি করতে এটি আবশ্যক উভয় একটি টিসি টাইপ (টাইপ একটি সম্পত্তি) আছে, এবং একটি সম্ভাব্য-ওভারল্যাপিং-বিষয় (বস্তু, যা আমি অনুমান যেখানে আপনি বিভ্রান্ত পেয়েছিলাম একটি সম্পত্তি) না। এখনও আমরা জানি না কেন আমরা এখানে অনুলিপি সম্পর্কে কথা বলছি।
বিওনরোপ

উত্তর:


1

মেমোরি মডেল সম্পর্কে কথা বলার সময় মানটি অত্যন্ত ভয়ঙ্কর থাকে এবং এটি ব্যবহার করে এমন কয়েকটি পদ সম্পর্কে খুব স্পষ্ট নয়। তবে আমি মনে করি আমি একটি কার্যনির্বাহী তর্ক খুঁজে পেয়েছি (এটি কিছুটা দুর্বল হতে পারে)

প্রথমে, আসুন কী কোনও বস্তুর অংশ কি তা সন্ধান করি। [বেসিক.প্রকার] / 4 :

টাইপের কোনও অবজেক্টের অবজেক্টের উপস্থাপনা Tহ'ল ধরণের N unsigned charঅবজেক্ট দ্বারা গৃহীত বস্তুর ক্রম T, যেখানে Nসমান sizeof(T)। টাইপের কোনও অবজেক্টের মান উপস্থাপনা Tহ'ল বিটের সেট যা টাইপের মান উপস্থাপনে অংশ নেয় T। মান উপস্থাপনার অংশ না হওয়া অবজেক্টের উপস্থাপনের বিটগুলি প্যাডিং বিট হয়।

সুতরাং বস্তুর প্রতিনিধিত্ব b0 গঠিতsizeof(blub) unsigned char অবজেক্টগুলি , সুতরাং 8 বাইট। প্যাডিং বিটগুলি বস্তুর অংশ।

কোনও বস্তু অন্যের স্থান দখল করতে পারে না যদি এটি এর মধ্যে [নেস্টাল লাইফ] / ১.৫ এর মধ্যে নেস্টেড না থাকে :

কোনও বস্তুর আজীবন oটাইপেরT শেষ হয় যখন:

[...]

(১.৫) বস্তুটি যে oস্টোরেজটি দখল করে সেটিকে মুক্তি দেওয়া হয়, বা কোনও বস্তুর দ্বারা পুনঃব্যবহার করা হয় যা ([intro.object]) এর মধ্যে বাসা বাঁধে না ।

সুতরাং এর জীবনকাল b0শেষ হয়ে যাবে, যখন এটির দ্বারা দখলকৃত স্টোরেজটি অন্য কোনও বস্তুর দ্বারা পুনরায় ব্যবহার করা হবে, অর্থাৎb1 । আমি এটি যাচাই করে দেখিনি তবে আমি মনে করি যে মানক আদেশের সাথে প্রমাণিত হয় যে কোনও বস্তুর জীবিত থাকা তার সাবওবজেক্টটিও বেঁচে থাকা উচিত (এবং আমি কীভাবে এটি আলাদাভাবে কাজ করা উচিত তা কল্পনাও করতে পারি না)।

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

বিশেষত সাবোবজেক্টগুলির জন্য (সুতরাং অন্যদের মধ্যে স্থিতিশীল ডেটা সদস্যদের মধ্যেও) শর্ত [অন্তর্ভুক্তকরণ বিষয়বস্তু] / ৯ রয়েছে (তবে এটি সি ++ ২০, thx @ বিআইএনআররোপের সাথে যুক্ত করা হয়েছিল)

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

(জোর আমার) এখানে আবারও, আমাদের এমন সমস্যা রয়েছে যা "দখল করে" সংজ্ঞায়িত করা হয় না এবং আবার আমি বস্তুর উপস্থাপনায় বাইটগুলি গ্রহণ করার পক্ষে যুক্তি প্রদর্শন করব। মনে রাখবেন যে এই [বেসিক.মোবজ] / পাদটীকা 29 এর একটি পাদটীকা রয়েছে

"হিসাবে যদি" ​​বিধি অনুসারে একটি প্রয়োগকারীকে একই মেশিনের ঠিকানায় দুটি বস্তু সংরক্ষণের অনুমতি দেওয়া হয় বা প্রোগ্রাম কোনও পার্থক্য ([intro.execution]) পর্যবেক্ষণ করতে না পারে তবে কোনও বস্তু সংরক্ষণ করতে পারে না।

কোনটি পর্যবেক্ষণযোগ্য পার্শ্ব-প্রতিক্রিয়া নেই তা প্রমাণ করতে পারলে যা সংকলকটি এটি ভেঙে দিতে পারে। আমি ভাবব যে অবজেক্ট লেআউট যেমন মৌলিক জিনিস জন্য এটি বেশ জটিল। সম্ভবত সেই কারণেই এই অপ্টিমাইজেশনটি নেওয়া হয় যখন ব্যবহারকারী তথ্য সরবরাহ করে যে [no_unique_address]বৈশিষ্ট্য যুক্ত করে বস্তুগুলি বিচ্ছিন্ন করার কোনও কারণ নেই ।

tl; dr: প্যাডিং হতে পারে বস্তুর অংশ এবং সদস্যদের বিভেদ হতে হবে।


1 আমি যে রেফারেন্সটি দখল করেছিলাম তার অর্থ গ্রহণের অর্থ যোগ করতে বাধা দিতে পারি না: ওয়েবেস্টারের রিভাইসড আনব্রিডিজড ডিকশনারি, জি ও সি মেরিয়াম, ১৯১ ((জোর দেওয়া খনি)

  1. ধারণ বা পূরণ করতে, এর মাত্রা; হাতে নিতে রুম বা স্থান; আবরণ বা পূরণ করা; যেমন, শিবিরটি পাঁচ একর জমি দখল করেছে। স্যার জে হার্শেল।

অভিধান ক্রল না করে কী স্ট্যান্ডার্ড ক্রল সম্পূর্ণ হবে?


2
আমার মনে হয়, "স্টোরেজ বাই ডিসট্রয়মেন্ট বাইটস" অংশটি যথেষ্ট হবে, আমার মনে হয় - তবে এই শব্দটি কেবলমাত্র সি ++ তে যুক্ত হয়েছিল পরিবর্তনের অংশ হিসাবে no_unique_address। এটি পরিস্থিতি সি ++ 20 কম পরিষ্কারের আগে ছেড়ে দেয়। আমি আপনার যুক্তি বুঝতে পারি নি "বেসিক.লাইফ / ১.৫.৫ থেকে" কোন বস্তু যদি এর মধ্যে বাসা বাঁধে না তবে অন্যের স্থান দখল করতে পারে না, বিশেষত "কীভাবে অবজেক্টটি যে স্টোরেজটি ছেড়ে দেয়" থেকে কীভাবে পাবেন? "কোনও বস্তু অন্যের স্থান দখল করতে পারে না" to
বিওনরোপ

1
আমি সেই অনুচ্ছেদে একটি ছোট ব্যাখ্যা যোগ করেছি। আমি আশা করি এটি আরও বোধগম্য করে তোলে। নাহলে আমি আগামীকাল এটি আবার দেখব, এই মুহূর্তে আমার জন্য বেশ দেরি হয়ে গেছে।
n314159

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

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

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