Bool, টাইপ ভাষা রানটাইম মধ্যে অনেক বেমানান পছন্দ সঙ্গে একটি ছককাটা ইতিহাস রয়েছে। ডেনিস রিচি, সি ভাষা আবিষ্কার করেছেন এমন লোকটি তৈরি করেছিলেন anতিহাসিক নকশা-পছন্দ দিয়ে এটি শুরু হয়েছিল। এটা একটা ছিল না bool, ধরন, বিকল্প ছিল int- এ যেখানে 0 একটি মান প্রতিনিধিত্ব করে মিথ্যা এবং অন্য কোন মান হিসেবে বিবেচনা করা হয় সত্য ।
এই পছন্দটি Winapi এগিয়ে বাহিত হয়, ব্যবহার pinvoke করার প্রাথমিক কারণ, এটা একটি typedef জন্য রয়েছে BOOL
যা সি কম্পাইলার এর জন্য উপনাম হল int- এ শব্দ। আপনি একটি সুনির্দিষ্ট [MarshalAs] অ্যাট্রিবিউট তারপর একটি C # এর প্রয়োগ না থাকে তাহলে bool, একটি bool রূপান্তরিত হয়, এইভাবে একটি ক্ষেত্র যে 4 বাইট দীর্ঘ উত্পাদক।
আপনি যাই করুন না কেন, আপনার স্ট্রাক্ট ঘোষণার সাথে আপনি যে ভাষাটি ব্যবহার করছেন সে ভাষায় রানটাইম পছন্দের সাথে মিল থাকতে হবে। যেমনটি উল্লেখ করা হয়েছে, উইনাপির জন্য BOOL তবে বেশিরভাগ সি ++ বাস্তবায়ন বাইট বেছে নিয়েছে , বেশিরভাগ COM অটোমেশন ইন্টারপ VARIANT_BOOL ব্যবহার করে যা সংক্ষিপ্ত ।
প্রকৃত একটি C # এর আকার bool
এক বাইট। সিএলআরের একটি শক্তিশালী ডিজাইন লক্ষ্য এটি আপনি খুঁজে পেতে পারেন না cannot লেআউট একটি বাস্তবায়ন বিশদ যা প্রসেসরের উপর খুব বেশি নির্ভর করে। প্রসেসরগুলি ভেরিয়েবলের ধরণ এবং প্রান্তিককরণ সম্পর্কে খুব পছন্দসই, ভুল পছন্দগুলি উল্লেখযোগ্যভাবে পারফরম্যান্সকে প্রভাবিত করতে পারে এবং রানটাইম ত্রুটির কারণ হতে পারে। লেআউটটিকে অন্বেষণযোগ্য করে,। নেট একটি সর্বজনীন টাইপ সিস্টেম সরবরাহ করতে পারে যা প্রকৃত রানটাইম বাস্তবায়নের উপর নির্ভর করে না।
অন্য কথায়, লেআউটটি পেরেক করার জন্য আপনাকে রানটাইমের সময় সর্বদা কোনও কাঠামো মার্শাল করতে হবে। অভ্যন্তরীণ বিন্যাস থেকে ইন্টারপ বিন্যাসে রূপান্তর করা হয়। এটি খুব দ্রুত হতে পারে যদি লেআউটটি অভিন্ন হয়, ধীরে ধীরে যখন ক্ষেত্রগুলি পুনরায় সাজানো দরকার কারণ এটির জন্য সর্বদা কাঠামোর একটি অনুলিপি তৈরি করা প্রয়োজন। এর জন্য প্রযুক্তিগত শব্দটি সুস্পষ্ট , দেশীয় কোডে একটি ত্রুটিযুক্ত কাঠামো পাস করা দ্রুত কারণ পিনভোক মার্শালার কেবল একটি পয়েন্টার পাস করতে পারে।
পারফরম্যান্স হ'ল বুল একক বিট না হওয়ার মূল কারণও । কিছু প্রসেসর রয়েছে যা কিছুটা সরাসরি সম্বোধনযোগ্য করে তোলে, ক্ষুদ্রতম ইউনিট একটি বাইট। বাইটের বাইরে কিছুটা মাছ ধরার জন্য একটি অতিরিক্ত নির্দেশের প্রয়োজন, এটি নিখরচায় আসে না। এবং এটি কখনই পারমাণবিক হয় না।
সি # সংকলক অন্যথায় আপনাকে লজ্জা দেয় না যে এটি 1 বাইট, ব্যবহার লাগে sizeof(bool)
। কোনও ক্ষেত্র রানটাইমের সময় কয়টি বাইট নেয়, এটি এখনও চমকপ্রদ ভবিষ্যদ্বাণীকারী নয়, সিএলআরকে .NET মেমরির মডেলটি প্রয়োগ করতে হবে এবং এটি প্রতিশ্রুতি দেয় যে সহজ পরিবর্তনশীল আপডেটগুলি পারমাণবিক । এর জন্য ভেরিয়েবলগুলি মেমরিতে সঠিকভাবে প্রান্তিক হওয়া প্রয়োজন যাতে প্রসেসর এটি একটি একক মেমরি-বাস চক্রের সাথে আপডেট করতে পারে। খুব সুন্দর, একটি বুলের জন্য মেমরিতে আসলে 4 বা 8 বাইটের প্রয়োজন হয়। পরবর্তী সদস্যটি সঠিকভাবে প্রান্তিক করা আছে তা নিশ্চিত করতে অতিরিক্ত প্যাডিং যুক্ত করা হয়েছিল ।
সিএলআর প্রকৃতপক্ষে লেআউটটিকে অপরিবর্তনযোগ্য হওয়ার সুবিধা গ্রহণ করে, এটি একটি শ্রেণির বিন্যাসকে অনুকূলিত করতে পারে এবং ক্ষেত্রগুলি পুনরায় সাজিয়ে তুলতে পারে যাতে প্যাডিং হ্রাস করা যায়। সুতরাং, বলুন, আপনার যদি একটি বুল + ইনট + বুল সদস্য সহ একটি ক্লাস থাকে তবে এটির জন্য 1 + (3) + 4 + 1 + (3) মেমরির বাইট লাগবে, (3) মোট 12 এর জন্য প্যাডিং হবে বাইট। 50% বর্জ্য। স্বয়ংক্রিয় বিন্যাস 1 + 1 + (2) + 4 = 8 বাইটে পুনরায় সাজানো। কেবলমাত্র একটি শ্রেণিতে স্বয়ংক্রিয় লেআউট থাকে, স্ট্রাক্টের ডিফল্ট অনুসারে ক্রমিক লেআউট থাকে।
আরও নির্লজ্জভাবে, একটি বুলের একটি সি সি ++ প্রোগ্রামে প্রায় 32 বাইটের প্রয়োজন হতে পারে একটি আধুনিক সি ++ সংকলক যা AVX নির্দেশনা সেট সমর্থন করে। যা একটি 32-বাইট প্রান্তিককরণ প্রয়োজনীয়তা আরোপ করে, বুল ভেরিয়েবলটি 31 বাইট প্যাডিং সহ শেষ হতে পারে। এছাড়াও। নেট জুইটার সিমডি নির্দেশিকা নির্গত না করার মূল কারণ, স্পষ্টভাবে মোড়ানো না থাকলে এটি সারিবদ্ধতা গ্যারান্টি পেতে পারে না।