আপডেট হয়েছে, নীচে দেখুন!
আমি শুনেছি এবং পড়েছি যে সি ++ 0x একটি সংকলককে নিম্নলিখিত স্নিপেটের জন্য "হ্যালো" মুদ্রণের অনুমতি দেয়
#include <iostream>
int main() {
while(1)
;
std::cout << "Hello" << std::endl;
}
থ্রেড এবং অপ্টিমাইজেশনের ক্ষমতাগুলির সাথে এর স্পষ্টতই কিছু করার রয়েছে। এটি আমার কাছে দেখে মনে হচ্ছে এটি যদিও বহু লোককে অবাক করে তুলতে পারে।
কেন এটির অনুমতি দেওয়া প্রয়োজন তা সম্পর্কে কারও কি ভাল ব্যাখ্যা আছে? রেফারেন্সের জন্য, সর্বাধিক সাম্প্রতিক সি ++ 0x খসড়াটি এতে বলেছে6.5/5
একটি লুপ, স্টেটমেন্টের ক্ষেত্রে ফর স্টেটমেন্টের বাইরে স্টেটমেন্টের ক্ষেত্রে,
- লাইব্রেরিতে I / O ফাংশনগুলিতে কোনও কল দেয় না এবং
- অস্থির বস্তু অ্যাক্সেস বা সংশোধন করে না, এবং
- কোনও সিঙ্ক্রোনাইজেশন অপারেশন (1.10) বা পারমাণবিক ক্রিয়াকলাপ সম্পাদন করে না (ধারা 29)
সমাপ্তকরণ বাস্তবায়ন দ্বারা ধরে নেওয়া যেতে পারে। [দ্রষ্টব্য: এটি সমাপ্তি প্রমাণিত না হওয়া সত্ত্বেও খালি লুপগুলি অপসারণের মতো সংকলক ট্রান্সফরমেশনগুলি অনুমোদনের উদ্দেশ্যে। - শেষ নোট]
সম্পাদনা:
এই অন্তর্দৃষ্টিপূর্ণ নিবন্ধটি সেই মানক পাঠ্য সম্পর্কে বলে
দুর্ভাগ্যক্রমে, "অপরিজ্ঞাত আচরণ" শব্দ ব্যবহার করা হয়নি। যাইহোক, মানক যে কোনও সময় "সংকলক পি ধরে নিতে পারে" বলে বোঝানো হয়েছে যে কোনও প্রোগ্রামের মধ্যে পি-র সম্পত্তি নেই এমন একটি শব্দার্থবিজ্ঞান রয়েছে।
এটি কি সঠিক, এবং সংকলককে কি উপরের প্রোগ্রামটির জন্য "বাই" মুদ্রণের অনুমতি দেওয়া হয়েছে?
এখানে আরও একটি অন্তর্দৃষ্টিপূর্ণ থ্রেড রয়েছে , যা সি এর সাথে অভিন্ন পরিবর্তন সম্পর্কে, উপরের লিঙ্কযুক্ত নিবন্ধটি গাই দ্বারা শুরু হয়েছিল। অন্যান্য দরকারী তথ্যগুলির মধ্যে, তারা এমন একটি সমাধান উপস্থাপন করে যা দেখে মনে হয় যে এটি সি ++ 0x- এও প্রযোজ্য ( আপডেট : এটি এন 3225 দিয়ে আর কাজ করবে না - নীচে দেখুন!)
endless:
goto endless;
কোনও সংকলককে এটিকে অপ্টিমাইজ করার অনুমতি নেই, মনে হয় এটি কোনও লুপ নয়, তবে একটি লাফ। আরেকটি লোক সি ++ 0 এক্স এবং সি201 এক্স-এর প্রস্তাবিত পরিবর্তনের সংক্ষিপ্তসার জানায়
একটি লুপ লিখে, প্রোগ্রামারটি হয় যে লুপটি দৃশ্যমান আচরণ (আই / ও সম্পাদন করে, অস্থিতিশীল বস্তুগুলি অ্যাক্সেস করে, বা সিঙ্ক্রোনাইজেশন বা পারমাণবিক ক্রিয়াকলাপ সম্পাদন করে) দিয়ে কিছু করে, বা এটি শেষ অবধি সমাপ্ত হয় either যদি আমি কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই অসীম লুপ লিখে সেই অনুমানটিকে লঙ্ঘন করি তবে আমি কম্পাইলারের কাছে মিথ্যা বলছি, এবং আমার প্রোগ্রামের আচরণটি অপরিজ্ঞাত। (আমি ভাগ্যবান হলে, সংকলকটি আমাকে এ সম্পর্কে সতর্ক করতে পারে)) ভাষা দৃশ্যমান আচরণ ছাড়াই অসীম লুপটি প্রকাশ করার উপায় সরবরাহ করে না (আর সরবরাহ করে না?)।
N3225 সহ 3.1.2011 এ আপডেট করুন: কমিটি পাঠ্যটিকে 1.10 / 24 এ স্থানান্তরিত করে বলে
বাস্তবায়ন ধরে নেওয়া যেতে পারে যে কোনও থ্রেড অবশেষে নিম্নলিখিতগুলির মধ্যে একটি করবে:
- বিনষ্ট,
- I / O ফাংশনটিতে একটি লাইব্রেরিতে কল করুন
- একটি অস্থির বস্তু অ্যাক্সেস বা সংশোধন করুন, বা
- একটি সিঙ্ক্রোনাইজেশন অপারেশন বা একটি পারমাণবিক অপারেশন সঞ্চালন।
goto
কৌতুক হবে না আর কাজ!
int x = 1; for(int i = 0; i < 10; ++i) do_something(&i); x++;
রূপান্তর করার অনুমতি দেওয়া হচ্ছে for(int i = 0; i < 10; ++i) do_something(&i); int x = 2;
? অথবা সম্ভবত অন্যভাবে, লুপের আগে x
সূচনা করার সাথে 2
। এটি বলতে do_something
পারে যে এর মান সম্পর্কে কোন চিন্তা করে না x
, সুতরাং এটি একেবারে নিরাপদ অপ্টিমাইজেশান, যদি do_something
এর মূল্য i
পরিবর্তন না করে যদি আপনি অসীম লুপে পৌঁছে যান।
main() { start_daemon_thread(); while(1) { sleep(1000); } }
কোনও পটভূমির থ্রেডে আমার ডেমন চালানোর পরিবর্তে তাত্ক্ষণিকভাবে প্রস্থান করা যেতে পারে?
while(1) { MyMysteriousFunction(); }
সেই রহস্যময় ফাংশনটির সংজ্ঞা না জেনে স্বাধীনভাবে সংকলনযোগ্য হতে হবে, তাই না? সুতরাং এটি নির্ধারণ করতে পারি যে এটি কোনও লাইব্রেরির I / O ফাংশনগুলিতে কল করে কিনা? অন্য কথায়: অবশ্যই প্রথম বুলেটটি ফাংশন করা যেতে পারে কোন ক্রিয়াকলাপের জন্য কোনও কল দেয় না ।