লুপের ভিতরে কোনও স্থানীয় অবজেক্টের ডেস্ট্রাক্টরকে পরবর্তী পুনরাবৃত্তির আগে ডেকে আনা গ্যারান্টিযুক্ত?


11

যখন আমার একটি লুপ থাকে এবং এই লুপের ভিতরে একটি নতুন স্ট্যাক ভেরিয়েবল তৈরি করে (এটি লুপের দেহের অভ্যন্তরে ঘোষিত ভেরিয়েবল এবং এটির স্থায়ীভাবে ধরে রাখা হয় না), তখন এই আইটেমটির ডেস্ট্রাক্টর কি পরবর্তী পুনরাবৃত্তি শুরুর আগে ডেকে আনার গ্যারান্টিযুক্ত বা সম্ভবত সংকলক দ্বারা আনলোলিং লুপ সম্পর্কে কিছু পরিবর্তন?


1
প্রতি সেফ লুপ আনরোলিং কার্যকর করার ক্রম পরিবর্তন করবে না। তবে লুপ সমান্তরালকরণ এটি করতে পারে।
অ্যাড্রিয়ান মোল

উত্তর:


8

থেকে n4800:

.36.3.3 ব্লক স্কোপ :

একটি ব্লকে ঘোষিত একটি নাম (8.3) সেই ব্লকের স্থানীয়; এটি ব্লক সুযোগ আছে। এর সম্ভাব্য সুযোগটি এর ঘোষণার পয়েন্ট (6.3.2) থেকে শুরু হয় এবং এটির ব্লকের শেষে শেষ হয়। ব্লক স্কোপে ঘোষিত একটি ভেরিয়েবল স্থানীয় ভেরিয়েবল।

.310.3.6 ধ্বংসকারী :

যখন কোনও অবজেক্ট তৈরি করা হয় সেই ব্লকটি প্রস্থান করে (8.7)

§4.1.1 বিমূর্ত মেশিন :

এই বিধানটিকে কখনও কখনও "বিস্ময়কর" বিধি বলা হয়, কারণ কোনও বাস্তবায়নের ফলে এই দলিলের যে কোনও প্রয়োজনীয়তা উপেক্ষা করা যায় যতক্ষণ না ফলস্বরূপ প্রয়োজনটি মানা হয়েছিল, যতক্ষণ না পর্যবেক্ষণযোগ্য আচরণ থেকে নির্ধারণ করা যায় প্রোগ্রাম

[জোর আমার]

তাই হ্যাঁ. আপনার পরিবর্তনশীল লুপের শেষে স্কোপের বাইরে চলে যায় (যা একটি ব্লক) এবং তাই প্রোগ্রামটির আচরণ পর্যবেক্ষণকারী যে কেউ বলতে পারেন তার নষ্টকারীকে বলা হয়


1
যখন সেখানে ধ্বংসকারীকে ডাকা হয় তখন কিছুই নেই।
স্টার্ক

2
@ স্টার্ক যা তাদের এটি করতে দেয় তা হ'ল বিধি-ব্যবস্থা। মান কেবল বিমূর্ত মেশিনের আচরণ নির্দিষ্ট করে specif এখানে উত্তরের সমস্ত বিবরণে প্রবেশ করা প্রয়োজন কিনা তা নিশ্চিত নন।
ম্যাক্স ল্যাংফোফ

2
@ স্টার্ক এটি আইএমও, প্রশ্নের সাথে সম্পর্কিত নয়। আপনি পাশাপাশি বলতে পারেন যে ধ্বংসকারীরা অন্তর্ভুক্ত হতে পারে এবং তাই এডে মোটেই না call। অথবা, যদি তারা কার্যকরভাবে (যদি নিয়ম করে) কিছু না করেন তবে এই জাতীয় ধ্বংসকারীদের পক্ষে কোনও সমাবেশ হতে পারে না।
ড্যানিয়েল ল্যাঙ্গার

2
@ স্টার্ক দেখুন " আসফ " নিয়মটি ঠিক কী?
ড্যানিয়েল ল্যাঙ্গার

2
@stark কোথায় সংজ্ঞায়িত করা হয় কি ? দ্রষ্টব্য যে এই আলোচনাটি প্রশ্নের বাইরে বিষয়বস্তু। আপনি এই সমস্যা সম্পর্কে অন্য একটি পৃথক প্রশ্ন জিজ্ঞাসা করতে পারেন।
ড্যানিয়েল ল্যাঙ্গার

8

হ্যাঁ. আপনি যখন "ব্লকগুলি" বিবেচনা করছেন যাতে আপনি একটি ভেরিয়েবল ঘোষণা করেন, অর্থাত্ কোন যুগল বন্ধনীগুলির মধ্যে visual লুপটি নিজেই একটি ব্লক, এবং যখন এটি পরবর্তী পুনরাবৃত্তির আগে ক্লোজিং ব্র্যাকেটে পৌঁছায়, লুপে ঘোষিত স্বয়ংক্রিয় স্টোরেজ ভেরিয়েবলের সমস্ত ধ্বংসকারীকে ডাকা হয়।

সংকলক দ্বারা আনরোলিং লুপ সম্পর্কে কিছু পরিবর্তন হতে পারে?

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


2
থাম্ব নিয়মের জন্য +1, কোড লেখার সময় সংকলক ইন্টার্নালগুলি নিয়ে চিন্তা করা উচিত নয়। আমার উত্তরে একই চেতনায় কিছু যুক্ত করতে যাচ্ছিল, তবে এখন এটি ইতিমধ্যে রয়েছে
cle 463035818

কপি-এলিসন এবং আরভিও প্রোগ্রামের আচরণ পরিবর্তন করে, তাই না?
জিন-ব্যাপটিস্ট ইউনিস

@ জিন-ব্যাপটিস্ট [class.copy.elision]
ইউনস

ধনুর্বন্ধনী জুড়ি না । আপনি লিখতে পারেন for(...) X x{};এবং xপ্রতিটি পুনরাবৃত্তিতে অবজেক্টটি তৈরি করা হবে + বিনষ্ট। লাইভ ডেমো । একটি প্রাসঙ্গিক স্ট্যান্ডার্ড বিভাগ stmt.iter / 2
ড্যানিয়েল ল্যাঙ্গার

@ ড্যানিয়েলসরেইনস্টেটমোনিকা -৯.৫.২ অনুসারে [stmt.iter]এটি সম্পূর্ণ সমতুল্য (জোর দেওয়া খনি): "যদি কোনও পুনরাবৃত্তির বিবৃতিতে সাবস্টিমেটমেন্ট কোনও একক বিবৃতি হয় এবং যৌগিক-বিবৃতি না হয় তবে মনে হয় এটি আবার একটি যৌগিক বিবৃতি সম্বলিত লেখা হয়েছিল was মূল বিবৃতি "। সংক্ষেপে, একটি একক বিবৃতিতে ধনুর্বন্ধনী সঙ্গে বা ছাড়া মানে একই জিনিস এবং ধনুর্বন্ধনী অন্তর্ভুক্ত হয়। আমি স্বচ্ছতার জন্য এটি বাদ দিয়েছি।
জেবিএল

2

ডেস্ট্রাক্টরকে প্রতিটি পুনরাবৃত্তির জন্য ডাকা হয়। সুতরাং কিছু ক্ষেত্রে এটি লুপের পরিবর্তে লুপের বাইরে পরিবর্তনশীল ঘোষণা করা দ্রুত faster নিম্নলিখিত ক্ষেত্রে ধরে নেওয়া:

std::string temp;
for(int i = 0; i < 10; ++i){
    temp = arr[i];
    doSomething(temp);
}

লুপটি কার্যকর করার সময় ডেস্ট্রাক্টরকে ডাকা হয় না। এটি শুধু ওভাররাইড করে temp

তবে আপনি যদি std::string temp = arr[i]কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর ব্যবহার করেন তবে প্রতিটি পুনরাবৃত্তির জন্য ডাকা হবে। আমি মনে করি আপনার খুব ঘন ঘন মৃত্যুদন্ড কার্যকর করা হয় এমন কোনও লুপের ক্ষেত্রে এটি কিছুটা রানটাইম যুক্ত করে।


নোট করুন যে ডেস্ট্রাক্টররা ডেকে আনা বা না করা কেবল কার্য সম্পাদনের প্রশ্ন নয়। আপনার যখন কোনও রাইআইআই টাইপ থাকে, আপনি বিশেষত প্রতিটি পুনরাবৃত্তির জন্য ডেস্ট্রাক্টরকে কল করতে চান
idclev 463035818

নিশ্চিত না যে এটি সত্য। যখন টেম্প নতুন মান দিয়ে পুনরায় স্বাক্ষরিত হয় তখন বিষয়গুলি 'টেম্প' এর ডিস্ট্রাক্টরটি কি পূর্ববর্তী পুনরাবৃত্তির হাত থেকে ধরে রাখা হয় না?
ব্যবহারকারী 1282931

আমিও 100% নিশ্চিত নই। আপনি যদি কিছু ভুল পেয়ে থাকেন তবে আমার উত্তরটি সংশোধন করুন। :)
জুলিয়ান শ্নাবেল

0

পরের পুনরাবৃত্তির আগে ডেস্ট্রাক্টরকে ডাকা হয়


0

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

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