স্ট্যান্ড :: লন্ডারের উদ্দেশ্য কী?


242

P0137 ফাংশন টেমপ্লেটটি পরিচয় করিয়ে দেয় std::launderএবং ইউনিয়ন, জীবনকাল এবং পয়েন্টার সম্পর্কিত বিভাগগুলিতে মানকে অনেকগুলি পরিবর্তন করে।

এই কাগজটি কী সমস্যার সমাধান করছে? আমার যে ভাষায় সচেতন হতে হবে সেগুলির পরিবর্তনগুলি কী? আর আমরা কী করবো launder?


2
আপনি নিজেই কাগজ সম্পর্কে জিজ্ঞাসা করছেন বা সম্পর্কে std::launder? std::launder"একই ধরণের বিদ্যমান অবজেক্টের দ্বারা দখলকৃত স্টোরেজে নির্মিত কোনও সামগ্রীর পয়েন্টার অর্জন করতে ব্যবহৃত হয়, যদিও এতে কনস্ট বা রেফারেন্স সদস্য থাকলেও।"
txtechhelp

7
বিষয়ে দরকারী লিঙ্ক । এছাড়াও এই প্রশ্ন স্ট্যাকওভারফ্লো.com
পল রুনি

এটি এখন ভিসি2017 এ 15.7.0 সংস্করণে প্রকাশিত হয়েছে
দামিয়ান

স্ট্যান্ড অনুসারে পয়েন্টারগুলি তুচ্ছ রকমের তাই লন্ডার কিছু করে না। ;)
কৌতূহলী

উত্তর:


250

std::launderযথাযথভাবে নামকরণ করা হয়েছে, যদিও এটি যদি আপনি জানেন তবে এটি কী জন্য। এটি মেমোরি লন্ডারিং করে

কাগজে উদাহরণ বিবেচনা করুন:

struct X { const int n; };
union U { X x; float f; };
...

U u = {{ 1 }};

এই বিবৃতিটি Uসহ প্রথম সদস্যকে আরম্ভ করে সামগ্রিক সূচনা করে {1}

কারণ nএকটি নয় constপরিবর্তনশীল, কম্পাইলার অনুমান করা যে মুক্ত u.x.nহইবে সবসময় 1 হবে।

সুতরাং আমরা যদি এটি করি তবে কি হবে:

X *p = new (&u.x) X {2};

কারণ Xতুচ্ছ, এটি নতুন জায়গায় তৈরি করার আগে আমাদের পুরানো বস্তুটি ধ্বংস করার দরকার নেই, সুতরাং এটি পুরোপুরি আইনী কোড। নতুন অবজেক্টটির nসদস্য 2 হবে।

তো বলুন ... কি u.x.nফিরবে?

সুস্পষ্ট উত্তরটি ২ হবে But তবে এটি ভুল, কারণ সংকলকটিকে ধরে নেওয়া যায় যে সত্যিকারের constপরিবর্তনশীল (কেবলমাত্র একটি নয় const&, তবে একটি অবজেক্ট ভেরিয়েবল ঘোষিত const ) কখনই পরিবর্তিত হবে না । তবে আমরা কেবল এটি পরিবর্তন করেছি।

[বেসিক.লাইফ] / 8 পরিস্থিতিটি ব্যাখ্যা করে যখন পুরানোটির ভেরিয়েবল / পয়েন্টার / রেফারেন্সের মাধ্যমে সদ্য নির্মিত বস্তুটি অ্যাক্সেস করা ঠিক হয়। এবং constসদস্য হওয়া একটি অযোগ্য কারণ।

সুতরাং ... আমরা কীভাবে u.x.nসঠিকভাবে কথা বলতে পারি ?

আমাদের স্মৃতিচারণ করতে হবে:

assert(*std::launder(&u.x.n) == 2); //Will be true.

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

অযোগ্যতার অন্য একটি কারণ হ'ল আপনি যদি বস্তুর ধরণ পরিবর্তন করেন। std::launderএখানেও সহায়তা করতে পারেন:

aligned_storage<sizeof(int), alignof(int)>::type data;
new(&data) int;
int *p = std::launder(reinterpret_cast<int*>(&data));

[বেসিক.লাইফ] / 8 আমাদের বলছে যে, আপনি যদি পুরনোটির স্টোরেজে কোনও নতুন অবজেক্ট বরাদ্দ করেন তবে আপনি পুরানো পয়েন্টারের মাধ্যমে নতুন অবজেক্টে অ্যাক্সেস করতে পারবেন না। launderআমাদের পার্শ্ব-পদক্ষেপ করতে দেয়।


34
তাহলে কি আমার টিএল; ডাঃ সঠিক: "লন্ডারিং মূলত নন-ইউবি টাইপের শাস্তির জন্য"?
druckermanly

13
কেন আপনি সত্য বলতে পারেন? "কারণ nএকটি constপরিবর্তনশীল, সংকলকটি u.x.nসর্বদা ১ হতে পারে বলে ধরে নিতে মুক্ত free " স্ট্যান্ডার্ডে এটি কোথায় বলে? আমি জিজ্ঞাসা করছি কারণ আপনি যে সমস্যার সমাধান করেছেন তা আমার কাছে বোঝা যাচ্ছে যে এটি প্রথমে মিথ্যা। এটি কেবলমাত্র বিধি-বিধানের অধীনে সত্য হওয়া উচিত, যা এখানে ব্যর্থ। আমি কী মিস করছি?
ব্যবহারকারী541686

10
@ মেহরদাদ [বেসিক.লাইফ] / ৮: " যদি, [...] স্টোরেজ অবস্থানে একটি নতুন অবজেক্ট তৈরি করা হয় যা মূল অবজেক্টটি দখল করেছে [...] মূল অবজেক্টটির নাম স্বয়ংক্রিয়ভাবে নতুন অবজেক্টের উল্লেখ করবে [...] যদি: [...] টাইপ [...] তে কোনও অ স্থিতিশীল ডেটা সদস্য থাকে না যার প্রকারটি
কনস্ট

14
@ ব্যারি ভেরি; ঠিকানায় অবস্থিত টি টাইপের কোনও অবজেক্ট যদি ptrপ্রতিনিধিত্ব করে না, তবে আপনি launderপূর্ব শর্তটি ভঙ্গ করেন , সুতরাং ফলাফল সম্পর্কে কথা বলার কোনও মানে নেই।
টিসি

17
@ নিকলবোলাস কেবলমাত্র আশা করতে পারে সুপারক্যাট কমিটির ততটা তদবির করবে যতটা তারা এসও-তে তৃতীয় পক্ষের ভাষা ব্যবহারকারীদের কাছ থেকে নিরন্তরভাবে উত্তর দাবি করে। এছাড়া, একটি ভাল সর্বোচ্চকরন কম্পাইলার আপনার সঠিক সমাধান কাম্য করবে memcpyএকটি ইন-জায়গা ধর্মের পুনর্ব্যাখ্যা মধ্যে সমর্থিত (অর্থাত শিথিল প্রান্তিককরণ) প্ল্যাটফর্মের উপর যাহাই হউক না কেন
আন্ডারস্কোর_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.