সি ++: বুল 8 বিট দীর্ঘ কেন?


132

সি ++ এ, আমি ভাবছি যে কেন বুল টাইপ 8 বিট দীর্ঘ (আমার সিস্টেমে), যেখানে বুলিয়ান মান ধরে রাখতে কেবল একটি বিটই যথেষ্ট?

আমি বিশ্বাস করতাম এটি পারফরম্যান্স কারণে ছিল, তবে তারপরে 32 বিট বা 64 বিট মেশিনে, যেখানে রেজিস্টারগুলি 32 বা 64 বিট প্রশস্ত হয়, পারফরম্যান্সের সুবিধা কী?

নাকি এই 'historicalতিহাসিক' কারণগুলির মধ্যে একটি?


9
একটি বিল আমার সিস্টেমে 8-বিট নয়। এটি 4 বাইট, ইন্ট হিসাবে সমান।
ব্রায়ান নিল

21
আপনি যখন যা ভাবছেন তা শেষবারের মতো কেউ ভেবেছিল, আমরা স্ট্যান্ড :: ভেক্টর <বিউল> দিয়ে সর্বাধিক ঘৃণিত স্টাইল "বৈশিষ্ট্য" =) নিয়ে এসেছি
ভিক্টর সেহর

1
jldupont, আমি মনে করি আপনি আমাকে ভুল ব্যাখ্যা করেছেন। আমি একটি সিস্টেমের জন্য জিজ্ঞাসা করছিলাম, যেখানে sizeof(bool)4 হবে I আমি শপথ করতে পারি যে এমএসভিসি-তে 32-বিট বাল রয়েছে, তবে আমি কেবল চেষ্টা করেছি এবং এটি হয় না।
অবাকর

7
সত্যি কথা বলতে গেলে সমস্যাটি vector<bool>হ'ল এটি চালাক হওয়ার চেষ্টা করে এবং বুলে বিটগুলিকে প্যাক করার চেষ্টা করে না, তবে এটি এটি করার চেষ্টা করে এবং নিজেকে একটি এসটিএল ধারক হিসাবে ছদ্মবেশ ধারণ করে । এটি একটি এসটিএল ধারক হওয়ার ভান না করে প্লেইন বিটসেটটি বেশ ভাল ছিল fine
jalf

2
@avakar - আপনি boolউইন্ডোজ BOOLটাইপের সাথে সি ++ ডাটা টাইপটি বিভ্রান্ত করছেন যা টাইপডেফড রয়েছে long। সুতরাং sizeof(bool) != sizeof(BOOL), যা আমি নিশ্চিত যে প্রচুর বিভ্রান্তি সৃষ্টি করে (এবং সম্ভবত যথেষ্ট সংখ্যক বাগ)। বিশেষত যেহেতু উইন্ডোজে এছাড়াও আছে booleanএবং BOOLEANটাইপিডেফগুলি, যা এর জন্য এলিয়াস unsigned char। এছাড়াও, নোট করুন যে এটি bool1 বাইট হিসাবে সাধারণ হওয়ার সময় , সি ++ স্ট্যান্ডার্ডের একটি নোট রয়েছে যা এটি নির্দিষ্ট করে এটি আরও sizeof(bool)বড় হতে পারে indicates
মাইকেল বুড়

উত্তর:


219

কারণ প্রতিটি সি ++ ডাটা টাইপ অবশ্যই ঠিকানাযোগ্য।

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


7
"বাইট" সম্বোধনটি একটি আর্কিটেকচারাল পছন্দ (এইচডাব্লু স্তর): একটি খুব ভাল একটি আলাদা "সম্বোধনের ইউনিট" সহ একটি সিস্টেম ডিজাইন করতে পারে। সাধারণ প্রসেসরগুলির জন্য, কোনও "বাইট" সম্বোধন করা কোনওভাবেই বাহ্যিক স্মৃতি থেকে "বাইট" এর চেয়ে বেশি আনতে হয়: এটি দক্ষতার কারণে is
jldupont

8
হ্যাঁ, এটি একটি হার্ডওয়্যার পছন্দ, এবং হার্ডওয়্যার যদি এটির অনুমতি দেয় তবে একটি বুলের আকার পরিবর্তন হতে পারে। তবে ওপি জিজ্ঞাসা করেছিল যে একটি বুল 8 বিট প্রশস্ত কেন, এবং এমন সিস্টেমে যেখানে এটি হয়, এটি সাধারণত কারণ সিপিইউ কেবল 8-বিট বাইটগুলি সম্বোধন করতে সক্ষম।
জাল্ফ

2
@ জালদুপন্ট: এমন কয়েকটি সিস্টেম রয়েছে যেখানে পয়েন্টার ঠিকানাগুলি বাইটের চেয়ে সূক্ষ্ম দানাযুক্ত (আমি পুরানো টিআই টিএমএস 3403/20 এর আগে প্রোগ্রাম করেছি, যা বিট-বুদ্ধিযুক্ত পয়েন্টার ব্যবহার করে) তবে এগুলি খুব বিরল।
মাইকেল কোহনে

1
আপনি কি বোঝাতে চেয়েছেন তা নিশ্চিত না। প্রতিটি বস্তু অবশ্যই ঠিকানাযোগ্য, এটি অবশ্যই কোনও অবজেক্টের ঠিকানা পুনরুদ্ধার করা সম্ভব। বস্তুর নিজস্ব ঠিকানা সংরক্ষণ করতে হবে না। একটি চর সাধারণত 8 বিট প্রশস্ত হয়, 256 অক্ষরের যে কোনও সংরক্ষণ করার জন্য যথেষ্ট, তবে প্রতিটি চরটিতে একটি ঠিকানাও থাকে যা মেমরিতে এটি কোথায় অবস্থিত তা দ্বারা সংজ্ঞায়িত করা হয়। এজন্য আপনি একটি চরে একটি পয়েন্টার তৈরি করতে পারেন।
জাল্ফ

88
আমি যদি একটি অদ্ভুত উপমা অবদান রাখতে পারি: আমার বিল্ডিংয়ে আটটি তল রয়েছে, তবে পোস্ট অফিস স্বীকৃতি দেয় না যে তারা আলাদা ঠিকানা। সুতরাং আমি যদি নিজের কাছে সমস্ত ঠিকানা চাই তবে আমাকে পুরো বিল্ডিংটি ভাড়া নিতে হবে, যদিও আমি আসলে এক তলায় ফিট করি। আমি "ঠিকানা সঞ্চয় করতে" অন্য সাতটি তল ব্যবহার করছি না, পোস্ট অফিসের নিয়মের কারণে আমি ঠিক সেগুলি নষ্ট করতে বাধ্য হচ্ছি যা ঠিকানাগুলি মেঝে নয়, ইমারতগুলিকে বোঝায়। সি ++ অবজেক্টগুলির অবশ্যই তাদের একটি ঠিকানা থাকতে হবে - প্রসবের পরে মেলটি বাছাই করার জন্য কোনও পোস্ট কক্ষ নেই ;-)
স্টিভ জেসপ

39

মেমরিটি বাইট অ্যাড্রেসযোগ্য। আপনি মেমরি থেকে পড়া বাইটটি স্থানান্তরিত বা মাস্কিং ছাড়াই, একটি বিটকে সম্বোধন করতে পারবেন না। আমি এটি একটি খুব বড় কারণ কল্পনা করব।


1
সর্বদা না। 8051 MCU, উদাহরণস্বরূপ, বিট Addressable অবস্থানগুলির 16 বাইট আছে
beached

20

একটি booleanটাইপ সাধারণত টার্গেট মেশিনের ঠিকানাযোগ্য স্মৃতির ক্ষুদ্রতম একককে অনুসরণ করে (অর্থাত্ 8 বাইট বাইট সাধারণত) usually

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

এই কারণে, "বুলিয়ান" বেস ডেটা ধরণের ব্যবহারের দক্ষতা বাড়াতে "বিট প্যাকিং" এর কৌশলগুলি ব্যবহার করা বেশ সাধারণ । enum2 কোডিংয়ের পাওয়ার সহ (সি তে) যেমন একটি কৌশল একটি ভাল উদাহরণ। একই ধরণের কৌশলটি বেশিরভাগ ভাষায় পাওয়া যায়।

আপডেট করা হয়েছে : একটি চমৎকার আলোচনা ধন্যবাদ, এটা যে আমার মনোযোগ আনা হয়েছিল sizeof(char)==1দ্বারা সংজ্ঞা C ++। অতএব, "বুলিয়ান" ডেটা টাইপের ঠিকানা সম্বোধনযোগ্য মেমরির ক্ষুদ্রতম ইউনিটে (আমার বক্তব্যকে শক্তিশালী করে) খুব সুন্দরভাবে আবদ্ধ।


সকল মন্তব্য আপনি এই সম্পর্কে বাম জন্য, এটি চিত্তাকর্ষক যে আপনি উত্তর সবচেয়ে গুরুত্বপূর্ণ অংশ বাদ: একটি boolটাইপ allocatable মেমরি ক্ষুদ্রতম ইউনিট অনুসরণ কারণ সি ++ প্রয়োজন যে এটা পয়েন্টার নির্মাণ করা সম্ভব হওয়া আবশ্যক । এই প্রয়োজনীয়তা ব্যতীত, boolবর্তমান বাইট-অ্যাড্রেসিয়েবল মেশিনগুলিতে এমনকি একটি সম্ভবত একটি একক হিসাবে উপস্থাপিত হতে পারে।
জাল্ফ

1
হুঁ ... আমি একটি সিপিইউ আর্কিটেকচার তৈরি করতে পারি যেখানে কিছুটা সম্বোধনযোগ্য হতে পারে ... আমি এর জন্য একটি সংকলক ইত্যাদিও লিখতে পারি। আমার কাছে মেমরির একটি বিশেষ অঞ্চল থাকতে পারে (বা যা কিছু হোক) যা "বিট অ্যাড্রেসনেবল" হবে। এটা কল্পনা অসম্ভব কোন প্রসারিত দ্বারা নয়।
jldupont

2
হ্যাঁ, এবং সেই সিস্টেমে একটি বুলকে এককভাবে তৈরি করা যেতে পারে। তবে ওপি জিজ্ঞাসা করল না "jldupouts হাইপোথিটিকাল সিপিইউতে একটি বিলি 8 বিট প্রশস্ত কেন"। তিনি বর্তমান, সাধারণ, প্রাত্যহিক সিপিইউ সম্পর্কে জিজ্ঞাসা করেছিলেন এবং সেগুলির কারণ, তারা বাইট-অ্যাড্রেসযোগ্য।
জাল্ফ

4
আকারের (চর) == 1 সি ++ এ প্রতি সংজ্ঞা অনুযায়ী, তাই আপনার হার্ডওয়্যার যা করতে পারে বা করতে পারে তা প্রাসঙ্গিক নয়। আপনার মাপের (বুল) <মাপের (চর) থাকতে পারে না। বিটিডাব্লু সি ++ এমনভাবে সংজ্ঞায়িত করা হয়েছে যে ক্ষুদ্রতম হার্ডওয়্যার অ্যাড্রেসযোগ্য ইউনিটের চরটি রাখা যদি সুবিধাজনক না হয় তবে হার্ডওয়্যার যা কিছু সম্বোধন করতে পারে তার কয়েকটি সাবুনিটকে সম্বোধন করার জন্য আপনার "ফ্যাট" পয়েন্টার থাকতে পারে। পুরানো শব্দ ঠিকানাযোগ্য আর্কিটেকচারের জন্য এটি কমপক্ষে কয়েকটি সি কম্পাইলারে ব্যবহৃত হয়েছে।
এপ্রোগ্রামার

@ অপপ্রগ্রাম:: sizeof(char)==1 definitionএটি আমার যুক্তির সেরা পাল্টা-যুক্তি। ধন্যবাদ!
jldupont

6

8-বিট সম্পর্কে মেমরির ক্ষুদ্রতম পরিমাণ যা উত্তরযোগ্য তা সঠিক। তবে কিছু ভাষা বুলিয়ানদের জন্য একরকম 1-বিট ব্যবহার করতে পারে। আমি পাস্কাল বাস্তবায়ন সেটগুলি বিট স্ট্রিং হিসাবে মনে করি। এটি হ'ল নিম্নলিখিত সংস্থার জন্য:

{1, 2, 5, 7}

আপনার স্মৃতিতে এটি থাকতে পারে:

01100101

আপনি চাইলে অবশ্যই সি / সি ++ তে অনুরূপ কিছু করতে পারেন। (আপনি যদি বুলেটিয়ানদের একগুচ্ছ খোঁজ রাখেন তবে তা বোধগম্য হতে পারে তবে এটি পরিস্থিতিটির উপর নির্ভর করে))


8
আসলে, সি ++ বিশেষায়িত কনটেইনার ভেক্টর <বিউল> এর সাথে এটি করে - এটি সাধারণত একটি দুর্যোগ হিসাবে দেখা হয়।

সি ++ সি দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত "বিট ক্ষেত্রগুলি" দিয়েও এটি করে থাকে যখন কোনও কাঠামো / শ্রেণীর সদস্য পরিবর্তনশীল ঘোষণার সময়, আপনি মান সংরক্ষণ করতে ব্যবহৃত বিটের সংখ্যা ঘোষণা করতে পারেন (উদাহরণস্বরূপ, "স্বাক্ষরযুক্ত স্বল্প ক্ষেত্র: 3")।

@ নীল: কেন এটি সাধারণত একটি দুর্যোগ হিসাবে দেখা হয়? এটি একটি পারফরম্যান্স সমস্যা?
Jérôme

2
@ জেরোম: এটি কারণ যেহেতু কিছুটা সম্বোধনযোগ্য নয়, তাই এটি নিয়মিতভাবে আচরণ করতে পারে না vector। এটি আসলে কোনও এসটিএল-ধরণের ধারক নয়, কারণ আচরণে বাধা রয়েছে। সবচেয়ে খারাপটি হ'ল এটি কারওর সাথে সমস্যা সৃষ্টি করে boolএবং সেগুলির একটি vectorতৈরি করতে চায়। এটি আশ্চর্যজনক আচরণ এবং আপনি কোনও ভাষায় এটি চান না।
ডেভিড থর্নলি

1
@jldupont - একবার এই জাতীয় বিন্দু তৈরি করা যথেষ্ট। এবং সি ++ কোনও গ্যারান্টি দেয় না যে বিটগুলি ঠিকঠাক (বরং বিপরীত), হার্ডওয়্যার যা সক্ষম তা বিবেচনা করে।

1

আমি জানি এটি পুরানো তবে আমি ভেবেছিলাম আমার 2 সেন্ট নিক্ষেপ করব।

আপনি যদি আপনার বুলিয়ান বা ডেটা টাইপকে কিছুটা সীমাবদ্ধ করেন তবে আপনার অ্যাপ্লিকেশনটি মেমোরি বাধা হওয়ার ঝুঁকিতে রয়েছে। মাত্র এক বিট দীর্ঘ মেমরিটিতে আপনি ত্রুটি সম্পর্কিত পরিসংখ্যানগুলি কীভাবে পরিচালনা করবেন?

আমি একটি কাজের সাক্ষাত্কারে গিয়েছিলাম এবং প্রোগ্রামের নেতৃত্বটি আমাকে যে বিবৃতি দিয়েছিল তা হ'ল, "আমরা যখন মিসাইল প্রেরণের জন্য সিগন্যালটি প্রেরণ করি তখন আমরা কেবল একটি ওয়্যারলেস মাধ্যমে বিট অফ অফ বিট প্রেরণ করি। একটি বিট প্রেরণ অতিমাত্রায় দ্রুত এবং আমরা যত দ্রুত সম্ভব সিগন্যালটির প্রয়োজন "

ঠিক আছে, আমি ধারণা এবং বিটস, বাইটস এবং ত্রুটি পরিচালনার বিষয়টি বুঝতে পেরেছি কিনা তা দেখার পরীক্ষা ছিল a কোনও খারাপ লোকের পক্ষে কতটুকু সহজ একটি বিট নাম্বার প্রেরণ করা যায়? বা ট্রান্সমিশনের সময় কিছুটা অন্য উপায়ে উল্টে গেলে কী হয়।


নতুন প্রশ্ন জিজ্ঞাসা করুন , অন্যান্য প্রশ্নের উত্তর হিসাবে আপনার প্রশ্ন পোস্ট করবেন না।
ইগর জেরোসিমিć

6
আমি মনে করি এই "উত্তর" এর মধ্যে থাকা প্রশ্নটি আসলে একটি বাকবিতণ্ডার, অর্থাত্ আমরা বুলেটগুলি এক বিট হিসাবে প্রয়োগ করি না কারণ একক বিট ত্রুটির পরিসংখ্যানগুলি পরিচালনা করতে পারে না।
স্টিফেন হল্ট

1
@ স্টেফেনহোল্ট কিন্তু এটি কারণ নয় এবং টিবিএইচ এই উত্তরটির কোনও অর্থ হয় না।
ডক

1
...কি? "ত্রুটি সম্পর্কিত পরিসংখ্যান" বলতে আপনার অর্থ কী তা আমি জানি না, সিআরসি বা এই জাতীয়, বা ফাঁদ উপস্থাপনা কিনা। তবে যে কোনও ক্ষেত্রে, এমনকি বৃহত্তর প্রকারগুলি "ত্রুটি সম্পর্কিত পরিসংখ্যান "গুলির জন্য তাদের অতিরিক্ত, 'অতিরিক্ত' বিট ব্যবহার করে না কারণ চরম-পরিবেশগত কোডাররা যথাযথভাবে ধরে নেয় যে তাদের হার্ডওয়্যার ত্রুটি সনাক্তকরণ / সংশোধন পরিচালনা করতে পারে তাদের কোড কখনও মেমরি পড়ার আগে, তাই তারা যাচাইকরণ তথ্য বা যা-ই হোক না কেন প্রতিটি ভেরিয়েবলকে প্যাড করে তাদের সময় কাটাতে হবে না। এ কারণেই boolওপি'র মেশিনে 8 বিট এবং খনিতে 32 টি বিট ব্যবহার করা হয় না কারণ অন্য 7 বা 31 বিট অবশ্যই কোনও "ত্রুটির পরিসংখ্যান" জন্য ব্যবহৃত হয় না। এটি কোনও
আন্ডারস্কোর_ডে

1

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

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