জাভার বুলিয়ান আদিম আকারটি সংজ্ঞায়িত করা হয়নি কেন?


111

জাভা ভার্চুয়াল মেশিন নির্দিষ্টকরণ বলেছেন বুলিয়ান-এর জন্য সীমিত সমর্থন নেই আদিম ধরনের।

কোনও জাভা ভার্চুয়াল মেশিনের নির্দেশাবলী কেবলমাত্র বুলিয়ান মানগুলিতে অপারেশনগুলিকে নিবেদিত নেই। পরিবর্তে, জাভা ভার্চুয়াল মেশিন ইন ডেটা টাইপের মানগুলি ব্যবহার করার জন্য জাভা প্রোগ্রামিং ভাষায় প্রকাশিত বুলিয়ান মানগুলিতে অভিব্যক্তিগুলি সংকলিত।

উপরের দিক থেকে বোঝা যায় (যদিও আমি এটি ভুল ব্যাখ্যা করে থাকতে পারি) যে বুলিয়ানগুলিতে অপারেটিং করার সময় ইনট ডাটা টাইপ ব্যবহার করা হয় তবে এটি 32 বিট মেমরির গঠন const প্রদত্ত যে একটি বুলিয়ান কেবল 1 বিট তথ্য উপস্থাপন করে:

  • বাইট বা সংক্ষিপ্ত টাইপটি কেন ইন্টের পরিবর্তে বুলিয়ানের প্রক্সি হিসাবে ব্যবহৃত হয় না?
  • যে কোনও জেভিএমের জন্য বুলিয়ান ধরণের সঞ্চয় করতে সঠিকভাবে কতটা মেমরি ব্যবহৃত হয় তা সন্ধানের সবচেয়ে নির্ভরযোগ্য উপায় কী?

উত্তর:


116

সংক্ষিপ্ত উত্তর: হ্যাঁ, বুলিয়ান মানগুলি 32-বিট সত্তা হিসাবে ব্যবহৃত হয়, তবে বুলিয়ানগুলির অ্যারে উপাদানগুলিতে 1 বাইট ব্যবহার করে।

দীর্ঘ উত্তর: জেভিএম একটি 32-বিট স্ট্যাক সেল ব্যবহার করে, স্থানীয় ভেরিয়েবল, পদ্ধতি আর্গুমেন্ট এবং এক্সপ্রেশন মানগুলি ধরে রাখতে ব্যবহৃত হয়। যে কক্ষগুলি 1 কক্ষের চেয়ে কম সেগুলি প্যাডে আউট করা হয়, 32 বিটের (দীর্ঘ এবং ডাবল) এর চেয়ে বড় আদিমগুলি 2 কোষ গ্রহণ করে। এই কৌশলটি অপকডগুলির সংখ্যা হ্রাস করে, তবে এর কিছু অদ্ভুত পার্শ্ব প্রতিক্রিয়া রয়েছে (যেমন বাইটগুলি মাস্ক করার প্রয়োজন হিসাবে)।

অ্যারেতে সংরক্ষিত আদিমাইভগুলি 32 বিটেরও কম ব্যবহার করতে পারে এবং অ্যারে থেকে আদিম মানগুলি লোড করতে এবং সঞ্চয় করতে বিভিন্ন অপকড রয়েছে। বুলিয়ান এবং বাইট মান উভয়ই baloadbastoreওপকোড ব্যবহার করে , যা বোঝায় যে বুলিয়ান অ্যারে উপাদানগুলিতে 1 বাইট নেয়।

মেমোরি অবজেক্ট লেআউটটি যতদূর যায়, এটি "ব্যক্তিগত বাস্তবায়ন" বিধিগুলির আওতাভুক্ত , এটি 1 বিট, 1 বাইট হতে পারে বা অন্য পোস্টার হিসাবে উল্লেখ করা হয়েছে, একটি 64-বিট ডাবল-ওয়ার্ড সীমানায় আবদ্ধ। সম্ভবত, এটি অন্তর্নিহিত হার্ডওয়্যার (32 বা 64 বিট) এর মূল শব্দ আকার নেয়।


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


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

@ ডিএমএ_কে: আমার প্রতিক্রিয়াতে যেমন উল্লেখ করা হয়েছে, শ্রেণীর উদাহরণের বিন্যাস বাস্তবায়ন নির্ভর। তবে নোট করুন যে শ্রেণীর দৃষ্টান্তগুলি স্ট্যাকের মধ্যে সংরক্ষণ করা হয় না, সেগুলি গাদাতে সংরক্ষণ করা হয় (যদিও আপনি জেডিকে 7 "পলায়ন বিশ্লেষণ" এর কিছু উল্লেখ দেখতে পাবেন বস্তুগুলি স্ট্যাক থেকে গাদা পর্যন্ত সরিয়ে রাখছেন, এটি এমনটি বলে মনে হয় না; java.sun.com/javase/7/docs/technotes/guides/vm/…) দেখুন
kdgregory

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

7

উত্তরাধিকারের স্তরক্রমের কোথাও একক বুলিয়ান 8 বাইট পর্যন্ত ব্যবহার করতে পারে! এটি প্যাডিংয়ের কারণে। আরও বিশদটি পাওয়া যাবে যে আমার জাভা অবজেক্টটি কত স্মৃতি ব্যবহার করে? :

বুলিয়ান কত পরিমাণে সেবন করে সে প্রশ্নে ফিরে আসছি, হ্যাঁ এটি কমপক্ষে একটি বাইট গ্রহণ করে তবে অ্যালাইনমেন্টের নিয়মের কারণে এটি আরও বেশি পরিমাণে গ্রাস করতে পারে। আইএমএইচও এটি জেনে রাখা আরও আকর্ষণীয় যে একটি বুলিয়ান [] প্রবেশ প্রতি প্রতি বাইট ব্যবহার করবে এবং এক বিট নয়, পাশাপাশি সারিবদ্ধতার কারণে এবং অ্যারের আকারের ক্ষেত্রের জন্য কিছু ওভারহেড গ্রহণ করবে। গ্রাফ অ্যালগরিদম রয়েছে যেখানে বিটগুলির বৃহত ক্ষেত্রগুলি দরকারী, এবং আপনার সচেতন হওয়া দরকার যে আপনি যদি বুলিয়ান ব্যবহার করেন তবে [সত্যিকার প্রয়োজনের তুলনায় আপনার প্রায় 8 গুণ বেশি মেমরি প্রয়োজন (1 বাইট বনাম 1 বিট)।


যাইহোক কীভাবে বুলেটিয়ান [] ব্যবহার করবেন?
থমাস জং 13

বুলিয়ান [] একটি মাস্কের জন্য ব্যবহার করা যেতে পারে। কখনও কখনও একটি বিটসেট যদিও আরও ভাল হতে পারে, কারণ এর কিছু কার্যকর পদ্ধতি রয়েছে।
মাইকেল মুন্সে

5

সংক্ষেপে জাভা- র 5 তম সংস্করণ (ও'রেলি) বলেছেন যে বুলিয়ান আদিম ধরণটি 1 বাইট। এটি ভুল হতে পারে, গাদা পরীক্ষা যা দেখায় তার উপর ভিত্তি করে। আমি ভাবছি যদি বেশিরভাগ জেভিএম-এর ভেরিয়েবলের জন্য বাইটের চেয়ে কম বরাদ্দ নিয়ে সমস্যা থাকে।


3

বুলিয়ান ম্যাপিং 32 বিবিট সিপিইউকে মনে রেখে করা হয়েছিল। ইন্ট ভ্যালুতে 32 বিট রয়েছে তাই এটি একটি ক্রিয়াকলাপে প্রক্রিয়া করা যায়।

পিটার নরভিগের জাভা আইএকিউ থেকে একটি সমাধান এখানে দেওয়া হয়েছে: আকারটি (কিছুটা অসম্পূর্ণতার সাথে) পরিমাপ করার জন্য প্রায়শই উত্তর দেওয়া প্রশ্নের :

static Runtime runtime = Runtime.getRuntime();
...
long start, end;
Object obj;
runtime.gc();
start = runtime.freememory();
obj = new Object(); // Or whatever you want to look at
end =  runtime.freememory();
System.out.println("That took " + (start-end) + " bytes.");

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

2

সিপিইউ একটি নির্দিষ্ট ডেটাটাইপ দৈর্ঘ্যে পরিচালিত করে। 32 বিট সিপিইউগুলির ক্ষেত্রে এগুলি 32 বিট লম্বা এবং তাই আপনি জাভাতে 'ইনট' বলছেন। সিপিইউ প্রক্রিয়া করার আগে তার নীচে বা উপরে সমস্ত কিছু অবশ্যই এই দৈর্ঘ্যে পূরণ করা বা বিভক্ত করা উচিত। এটি বেশি সময় নেয় না, তবে আপনার যদি বেসিক ক্রিয়াকলাপগুলির জন্য 1 এর পরিবর্তে 2 টি সিপিইউ চক্রের প্রয়োজন হয়, এর অর্থ দ্বিগুণ ব্যয় / সময়।

এই স্পেকটি 32 বিবিট সিপিইউগুলির জন্য উত্সর্গীকৃত যাতে তারা তাদের স্থানীয় ডেটাটাইপ দিয়ে বুলিয়ানগুলি প্রক্রিয়া করতে পারে।

আপনার এখানে কেবল একটি থাকতে পারে: গতি বা মেমরি - এসইএন গতির জন্য সিদ্ধান্ত নিয়েছে।


1

বুলিয়ান এক বিট তথ্য উপস্থাপন করে, তবে এর "আকার" এমন কিছু নয় যা যথাযথভাবে সংজ্ঞায়িত করা হয়েছে, বলুন সান জাভা টিউটোরিয়াল। বুলিয়ান আক্ষরিকের কেবল দুটি সম্ভাব্য মান রয়েছে যা সত্য এবং মিথ্যা। বিশদ জন্য জাভা ডেটা প্রকার দেখুন ।


-10

এইভাবে একটি। জাভা ফাইল তৈরি করবেন না কেন:

Empty.java

class Empty{
}

এবং এর মতো একটি শ্রেণি:

NotEmpty.java

class NotEmpty{
   boolean b;
}

এগুলি উভয়ই সংকলন করুন এবং একটি hex সম্পাদকের সাথে .class ফাইলগুলি তুলনা করুন।


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