এই সাধারণ কোডটি বিবেচনা করুন:
void g();
void foo()
{
volatile bool x = false;
if (x)
g();
}
আপনি এটি দেখতে পাচ্ছেন না gcc
বা clang
তেমন সম্ভাব্য কলটিকে অপ্টিমাইজও করতে পারবেন না g
। বিমূর্ত যন্ত্র যা অনুমান করা হল: এটা আমার বুঝতে সঠিক volatile
, তাই নির্দিষ্ট-ভাঁজ (হার্ডওয়্যার-ম্যাপ যেমন হচ্ছে কারণে) ভেরিয়েবল যে কোনো মুহূর্তে পরিবর্তিত হতে পারে false
মধ্যে আরম্ভের if
চেক ভুল হবে।
তবে এমএসভিসি g
সম্পূর্ণরূপে কলটি সরিয়ে দেয় ( volatile
যদিও পাঠ্যগুলি রাখে এবং লিখেন !)। এই মান-সম্মতিজনক আচরণ?
পটভূমি: আমি মাঝেমধ্যে এই ধরণের কনস্ট্রাক্টটি অন-দ্য ফ্লাইতে ডিবাগিং আউটপুট চালু / বন্ধ করতে সক্ষম করতে ব্যবহার করি: সংকলকটি সর্বদা স্মৃতি থেকে মানটি পড়তে হয়, সুতরাং ডিবাগিংয়ের সময় পরিবর্তনশীল / স্মৃতি পরিবর্তন করে সেই অনুযায়ী নিয়ন্ত্রণ প্রবাহকে পরিবর্তন করতে হবে । এমএসভিসি আউটপুট মানটি পুনরায় পড়তে পারে তবে এটিকে উপেক্ষা করে (সম্ভবত ধ্রুবক ভাঁজ এবং / অথবা ডেড কোড নির্মূলের কারণে), যা অবশ্যই এখানে আমার উদ্দেশ্যকে পরাস্ত করে।
সম্পাদনা:
পড়তে এবং লিখতে মুছে ফেলার বিষয়টি
volatile
এখানে আলোচনা করা হয়েছে: কোনও সংস্থাপককে কোনও স্থানীয় অস্থির পরিবর্তনশীলটিকে অপ্টিমাইজ করার অনুমতি দেওয়া হয়েছে কি? (ধন্যবাদ নাথান!) আমি মনে করি যে স্ট্যান্ডার্ডটি স্পষ্টভাবে স্পষ্ট যে এইগুলি পড়তে এবং লিখতে হবে অবশ্যই । তবে সেই আলোচনায় কভারারের পাঠকদের ফলাফল মঞ্জুর করা এবং তার ভিত্তিতে অনুকূলিত করা বৈধ কিনা তা কভার করে না । আমি মনে করি এটি স্ট্যান্ডার্ডে / / অনির্ধারিত , তবে কেউ আমাকে ভুল প্রমাণ করলে আমি খুশি হব।আমি অবশ্যই
x
এই সমস্যাটিকে পাশ থেকে ধাপে একটি অ-স্থানীয় পরিবর্তনশীল করতে পারি। এই প্রশ্নটি কৌতূহলের বাইরে।