আকার (কিছু পয়েন্টার) সর্বদা চারজনের সমান?


227

উদাহরণস্বরূপ: sizeof(char*)ফেরৎ 4. হিসাবে নেই int*, long long*আমি চেষ্টা করেছি সবকিছু যে। এর ব্যতিক্রম কি আছে?


51
এটিকে কেন চিহ্নিত করবেন? যে কোনও শিক্ষানবিশ জন্য ভাল প্রশ্ন।
মার্টিন ইয়র্ক

2
আমি সন্দেহ করি যে এটির মধ্যে আরও একটি প্রশ্ন লুকিয়ে রয়েছে: "আকারটি কী?" বা হতে পারে "কেন কোনও আকারের <কোনও পয়েন্টার> == 4? 4 কী এত বিশেষ?"। আমি কি সঠিক?

2
ঠিক আছে, এটি আপনার প্ল্যাটফর্মের উপর নির্ভর করে। বেশিরভাগ বাস্তবায়ন নির্দিষ্ট প্ল্যাটফর্মে প্রতিটি ধরণের পয়েন্টারের জন্য একই আকার ভাগ করে।
ফোয়েগন

উত্তর:


194

আপনি যে গ্যারান্টি পাবেন তা হ'ল sizeof(char) == 1। গ্যারান্টি সহ অন্য কোনও গ্যারান্টি নেই sizeof(int *) == sizeof(double *)

অনুশীলনে, পয়েন্টারগুলি 16-বিট সিস্টেমে 2 আকারের হবে (যদি আপনি এটি সন্ধান করতে পারেন), 32-বিট সিস্টেমে 4, এবং 64-বিট সিস্টেমে 8, তবে প্রদত্ত উপর নির্ভর করে লাভ করার মতো কিছুই নেই আকার।


96
এবং 24-বিট সিস্টেমে 3 বাইট। হ্যাঁ, আমি একটি নিয়ে কাজ করেছি। এম্বেড থাকা ডিভাইসের বিশ্বে আপনাকে স্বাগতম।
dwj

30
আমি 20-বিট পয়েন্টার সহ 16 বিট সিস্টেমে কাজ করেছি। সে ক্ষেত্রে কী
আকারে

5
@ মোমজার্ডিন: আইআইআরসি, ৮০৮86 এর মতো ছিল। একটি 16 বিট ঠিকানা এবং 4 বিট সেগমেন্ট রেজিস্টার ছিল। আমি বিশ্বাস করি একটি সাধারণ "নিকট" পয়েন্টারটি 16 বিট ছিল এবং "ফার" হিসাবে ঘোষিত একটি পয়েন্টার বেশি ছিল, সম্ভবত 24, যদিও আমি নিশ্চিত নই।
rmeador 23

18
আর একটি গ্যারান্টি হ'ল আকারের (চর *) == আকারের (অকার্যকর *), কারণ তাদের একই প্রতিনিধিত্বমূলক (বস্তু [আকার] এবং মান [তাদের মানের জন্য বিটগুলির প্রাসঙ্গিক] প্রতিনিধিত্ব থাকতে হবে)
জোহানেস স্কাউব - লিটব

7
যেহেতু প্রশ্নটি ব্যতিক্রমগুলির জন্য জিজ্ঞাসা করে এটি লক্ষ করা উচিত যে অ স্থিতিশীল সদস্য ফাংশন পয়েন্টারগুলি প্রায়শই স্বাভাবিক পয়েন্টারগুলির থেকে আলাদা আকার এবং প্ল্যাটফর্ম, টাইপ ইত্যাদির দ্বারাও পরিবর্তিত হয় that +1 ব্যতীত।
5342

36

এমনকি একটি সরল x86 32 বিট প্ল্যাটফর্মে, আপনি বিভিন্ন পয়েন্টার আকার পেতে পারেন, উদাহরণস্বরূপ এটি ব্যবহার করে দেখুন:

struct A {};

struct B : virtual public A {};

struct C {};

struct D : public A, public C {};

int main()
{
    cout << "A:" << sizeof(void (A::*)()) << endl;
    cout << "B:" << sizeof(void (B::*)()) << endl;
    cout << "D:" << sizeof(void (D::*)()) << endl;
}

ভিজ্যুয়াল সি ++ ২০০৮-এর অধীনে, পয়েন্টার-টু-সদস্য-ফাংশনের আকারের জন্য আমি 4, 12 এবং 8 পাই।

রেমন্ড চেন এখানে এই সম্পর্কে কথা বলেছেন ।


4
সদস্য ফাংশনগুলিতে পয়েন্টারগুলি একটি আসল ব্যথা। এটি দুর্ভাগ্যজনক যে সমস্ত সংকলকগুলি এটি ডিজিটাল মঙ্গল সি ++ সংকলকটির মতো করে না, যা সমস্ত ক্ষেত্রে 4 টি প্রত্যাবর্তন করে।
ডালে

জিসিসি 4.72 সমস্ত 8 মুদ্রণ করুন ... এটি কি সি ++ স্ট্যান্ডার্ডে সংজ্ঞায়িত?
গুব00st

2
@ গুবস্টেস্ট: সংজ্ঞায়িত করা একমাত্র জিনিসটি হল চরটি ১ টি is এই পয়েন্টার ধরণের মধ্যে ধারাবাহিকতার জন্য কোনও প্রয়োজন নেই।
অন্ধকার

ঠিক আছে ধন্যবাদ. তারপরে অবাক হওয়ার কিছু নেই জিসিসি এবং ভিসির আলাদা আলাদা বাস্তবায়ন রয়েছে।
গুব00st

5
@ উপগ্রহ হ্যাঁ রয়েছে: চর <= সংক্ষিপ্ত <= অন্তঃ <= দীর্ঘ <= দীর্ঘ দীর্ঘ
কোল জনসন

30

ইতোমধ্যে পোস্ট করা তালিকার অন্য একটি ব্যতিক্রম। 32-বিট প্ল্যাটফর্মে, পয়েন্টারগুলি 4 টি নয় , 6 বাইট নিতে পারে :

#include <stdio.h>
#include <stdlib.h>

int main() {
    char far* ptr; // note that this is a far pointer
    printf( "%d\n", sizeof( ptr));
    return EXIT_SUCCESS;
}

আপনি যদি ওপেন ওয়াটকমের সাথে এই প্রোগ্রামটি সংকলন করেন এবং এটি পরিচালনা করেন তবে আপনি 6 পাবেন, কারণ এটি বহুলাংশে নির্দেশ করে যে এটি 32-বিট অফসেট এবং 16-বিট সেগমেন্টের মানগুলি নিয়ে গঠিত


5
বিভাগ নেই, বরং নির্বাচক - এটি মেমরি ঠিকানার অংশ নয়, তবে
এলডিটি বা জিডিটিতে

1
X86 এ যখন বিভাগের স্থান এবং অফসেটগুলি স্থানের জায়গার সমতল হয় কেন?
ফুচলভি

@ LưuVĩnhPhúc কারন এটি কাছাকাছি পয়েন্টারগুলির খুব সাধারণ ক্ষেত্রে জায়গা সাশ্রয় করে যা সংক্ষিপ্ত আকারে ছোট করা যায়।
ক্রিস্টোফার ক্রিউটজিগ

1
@ ক্রিস্টোফার ক্রিউটজিগ এর অর্থ এই যে খণ্ডগুলি পিএইয়ের মতো ঠিকানা স্থান বাড়ানোর জন্য ব্যবহৃত হয়?
ফুক্লিভি

@ LưuVĩnhPhúc দীর্ঘ 32 বছর হয়েছে যে আমি 32 বিট কিছুতেই সমাবেশ করেছি। আমি যে অংশটি মনে করতে চাইছি তা হ'ল আপনি যে কোডটি করেছেন তার কাছে পয়েন্টারগুলির জন্য স্থান সংরক্ষণ করতে পারেন। এছাড়াও, সমস্ত 32 বিট আর্কিটেকচার নয় - অবশ্যই সবগুলি x86 এর উপর ভিত্তি করে নয় - একটি ফ্ল্যাট মেমরি মডেল ব্যবহার করুন। এটিকে ঘিরে আরও কিছু আলোচনার জন্য , যেমন, টেনোইক / বাফারওভারফ্লো / বাফারওভারফ্লো ১ এ এইচটিটিএমএল দেখুন, যদিও আমি যেমন বলেছি যে এটি অনেক সময় হয়ে গেছে এবং আমি কোনও কিছুর প্রতি আশ্বাস দিতে পারি না।
ক্রিস্টোফার ক্রিটজিগ

24

আপনি যদি একটি 64-বিট মেশিনের জন্য সংকলন করেন তবে এটি 8 হতে পারে।


2
যদিও এটি সাধারণত হয় তবে এটি অবশ্যই সত্য নয়। উদাহরণস্বরূপ, আপনি যদি একটি 64-বিট মেশিনে কম্পাইল করে থাকেন যেখানে শব্দের আকার 64৪-বিট, তবে আকার (চর *) সম্ভবত ১ হবে even এমনকি সাধারণ মেশিনে আরও বহিরাগত পয়েন্টার প্রকারের উল্লেখ না করার জন্য, যেমন গ্রহন এবং dmityugov লিখুন।
কাজ ড্রাগন

@ কাজড্রাগন sizeof(char*)==1,? তুমি কি নিশ্চিত? মানে না size(char)==1?
অ্যারন ম্যাকডেইড

3
অ্যারোন এমসিডিএইড আমি প্রকৃতপক্ষে মাপের (চর *) বোঝাতে চাইছি। মাপের (চর) সর্বদা 1. থাকে তবে আপনার মেশিনের শব্দটি যদি 64-বিট হয় এবং আপনার বিকাশের পরিবেশটি এমনভাবে প্রয়োগ করা হয় যাতে CHAR_BITS = 64 হয়, তবে এটি সম্ভব যে পয়েন্টারটি একই জায়গার সাথে চরের মতো ফিট হয় এবং তাই হবে এছাড়াও 1
কাজ ড্রাগন

তা না সত্য আছে x32-আবি sites.google.com/site/x32abi
phuclv

1
@ কাজড্রেগন আমি 16-বিট শব্দ এবং কোনও বাইট অ্যাড্রেসিং সহ একটি মেশিন তৈরি করছি (খুব ধীরে ধীরে, যখন ধারণা করা হয় না)। যদিও এটি কোনওভাবেই সি চালাতে পারে না।
ব্যবহারকারী 253751

17

প্রযুক্তিগতভাবে বলতে গেলে, সি স্ট্যান্ডার্ড কেবলমাত্র (আকার) == 1 এর গ্যারান্টি দেয় এবং বাকিটি বাস্তবায়নের উপর নির্ভর করে। তবে আধুনিক x86 আর্কিটেকচারে (যেমন ইন্টেল / এএমডি চিপস) এটি মোটামুটি অনুমানযোগ্য।

আপনি সম্ভবত শুনেছেন যে প্রসেসরগুলি 16-বিট, 32-বিট, 64-বিট, ইত্যাদি হিসাবে বর্ণিত হয়েছে এটির অর্থ সাধারণত প্রসেসরটি পূর্ণসংখ্যার জন্য এন-বিট ব্যবহার করে। যেহেতু পয়েন্টারগুলি মেমরি ঠিকানাগুলি সঞ্চয় করে এবং মেমোরি ঠিকানাগুলি পূর্ণসংখ্যা হয় তাই এটি আপনাকে কার্যকরভাবে জানায় যে পয়েন্টারগুলির জন্য কতগুলি বিট ব্যবহৃত হবে। আকারটি সাধারণত বাইটে পরিমাপ করা হয়, সুতরাং 32-বিট প্রসেসরের জন্য সংকলিত কোড পয়েন্টারগুলির আকার 4 (32 বিট / 8 বিট প্রতি বিট) হবে এবং 64-বিট প্রসেসরের কোডগুলি পয়েন্টারগুলির আকার 8 হবে বলে প্রতিবেদন করবে (64 বিট / 8 বিট প্রতি বিট) এখান থেকে ৩২-বিট প্রসেসরের 4 গিগাবাইট র‌্যামের সীমাবদ্ধতাটি আসে - প্রতিটি মেমরি ঠিকানা যদি বাইটের সাথে মিলে যায় তবে আরও মেমরির ঠিকানা দিতে আপনার 32-বিটের চেয়ে বড় পূর্ণসংখ্যার প্রয়োজন।


"আপনি সম্ভবত শুনেছেন যে প্রসেসরগুলি 16-বিট, 32-বিট, 64-বিট, ইত্যাদি হিসাবে বর্ণিত হয়েছে This এটির অর্থ সাধারণত প্রসেসরটি পূর্ণসংখ্যার জন্য এন-বিট ব্যবহার করে।" -> আমার কাছে একটি -৪-বিট মেশিন রয়েছে তবে আকার (ইনট) 4 বাইট। যদি আপনার বক্তব্যটি সত্য হয় তবে এটি কীভাবে সম্ভব ?!
সংগীত সারাওয়ানরাজ

6
@ সংগীতশারণওয়ারাজ: ৩২-বিট কোডের সাথে পিছনের সামঞ্জস্যের জন্য, তারা সিদ্ধান্ত নিয়েছে যে চারটি বাইট থাকবে এবং আপনাকে 'লম্বা' উল্লেখ করে 8 বাইট টাইপ ব্যবহার করতে অনির্বাচন করতে হবে। x86-64 এ প্রকৃতপক্ষে দেশীয় শব্দের আকার দীর্ঘ। এটি দেখার একটি উপায় হ'ল সাধারণত সংকলকগণ আপনার স্ট্রাকগুলিকে শব্দের প্রান্তিককরণ করার জন্য প্যাড করে (যদিও এমন কোনও আর্কিটেকচার থাকতে পারে যেখানে শব্দের আকার এবং প্রান্তিককরণ সম্পর্কিত নয়), সুতরাং আপনি যদি এটিতে কোনও ইন্ট (32-বিট) দিয়ে একটি কাঠামো তৈরি করেন, এবং এটিতে আকারে () কল করুন, আপনি যদি 8 ফেরত পান তবে আপনি জানেন যে এটি তাদের 64-বিট শব্দের আকারে প্যাড করছে।
জোসেফ গারভিন

@ সংগীতসর্বণরাজ: নোট করুন যে তাত্ত্বিকভাবে সিপিইউয়ের নেটিভ শব্দের আকার এবং সংকলক 'ইনট' যা নির্ধারণ করে তা নির্বিচারে আলাদা হতে পারে, এটি x86-64 কাছাকাছি আসার আগে 'ইনট' এর স্থানীয় শব্দের আকার হওয়ার কথা ছিল এটি পিছনের তুলনায় স্বাচ্ছন্দ্য দীর্ঘ।
জোসেফ গারভিন

ব্যাখ্যার জন্য ধন্যবাদ! :)
সংগীত সারাওয়ানরাজ

7

পয়েন্টারের আকার মূলত এটি প্রয়োগ করা সিস্টেমের আর্কিটেকচারের উপর নির্ভর করে। উদাহরণস্বরূপ, 32 বিটের মধ্যে একটি পয়েন্টারের আকার 4 বাইট (32 বিট) এবং একটি 8 বিট মেশিনে 8 বাইট (64 বিট)। একটি মেশিনে বিট প্রকারগুলি মেমরির ঠিকানা ছাড়া কিছুই নয়, এটি থাকতে পারে। ৩২ বিট মেশিনে 2^32অ্যাড্রেস স্পেস থাকতে পারে এবং bit৪ বিট মেশিনে 2^64অ্যাড্রেস স্পেস থাকতে পারে। সুতরাং একটি পয়েন্টার (ভেরিয়েবল যা মেমোরি অবস্থানের দিকে নির্দেশ করে 2^32 for 32 bit and 2^64 for 64 bit) একটি মেশিনগুলি ধারণ করে এমন কোনও মেমরি ঠিকানা ( ) এ নির্দেশ করতে সক্ষম হওয়া উচিত ।

এই কারণে আমরা একটি পয়েন্টারের আকার 32 বিট মেশিনে 4 বাইট এবং 64 বিট মেশিনে 8 বাইট হতে দেখি।


6

16/32/64 বিট পার্থক্য ছাড়াও বিজোড় জিনিসগুলি ঘটতে পারে।

এমন মেশিন রয়েছে যেখানে সাইজফ (ইন্টি *) এক মান হবে, সম্ভবত 4 কিন্তু যেখানে সাইজের (চর *) বড় larger মেশিনগুলি যে বাইটের পরিবর্তে শব্দগুলিকে স্বাভাবিকভাবে সম্বোধন করে সেগুলিকে সি বা সি ++ স্ট্যান্ডার্ডটি সঠিকভাবে প্রয়োগ করার জন্য শব্দের কোন অংশটি আপনি সত্যই চান তা নির্দিষ্ট করতে "বর্ধন" করতে হবে character

হার্ডওয়্যার ডিজাইনাররা বাইট অ্যাড্রেসিবিলিটির মান শিখেছেন বলে এটি এখন অত্যন্ত অস্বাভাবিক।


4
ক্রে ভেক্টর মেশিনের সি সংকলক যেমন টি 90, তেমন কিছু করে। হার্ডওয়্যার ঠিকানাগুলি 8 বাইট এবং 8-বাইট শব্দের দিকে নির্দেশ করে। void*এবং char*সফ্টওয়্যারটিতে পরিচালনা করা হয় এবং শব্দটির মধ্যে 3 বিট অফসেট যুক্ত হয় - তবে যেহেতু প্রকৃতপক্ষে কোনও 64-বিট অ্যাড্রেস স্পেস নেই তাই অফসেটটি 64-বিটের হাই-অর্ডার 3 বিটগুলিতে সঞ্চিত রয়েছে শব্দ। সুতরাং char*এবং int*একই আকার, তবে বিভিন্ন অভ্যন্তরীণ উপস্থাপনা আছে - এবং কোড যা ধরে নিয়েছে যে পয়েন্টারগুলি "সত্যই" ঠিক পূর্ণসংখ্যাগুলি খারাপভাবে ব্যর্থ হতে পারে।
কিথ থম্পসন

5

8 বিট এবং 16 বিট পয়েন্টার বেশিরভাগ লো প্রোফাইল মাইক্রোকন্ট্রোলারগুলিতে ব্যবহৃত হয়। এর অর্থ প্রতিটি ওয়াশিং মেশিন, মাইক্রো, ফ্রিজ, পুরানো টিভি এবং এমনকি গাড়ি।

আপনি বলতে পারেন রিয়েল ওয়ার্ল্ড প্রোগ্রামিংয়ের সাথে এগুলির কোনও সম্পর্ক নেই। তবে এখানে একটি বাস্তব বিশ্বের উদাহরণ রয়েছে: 1-2 বাইট পয়েন্টার সহ 1-2-4k র‌্যাম (চিপের উপর নির্ভরশীল) এর সাথে আরডুইনো।

এটি সাম্প্রতিক, সস্তা, সবার জন্য অ্যাক্সেসযোগ্য এবং কোডিংয়ের মূল্য।


4

লোকেরা 64৪-বিট (বা যাই হোক না কেন) সিস্টেম সম্পর্কে যা বলেছে তা ছাড়াও পয়েন্টার-টু-অবজেক্টের চেয়ে অন্য ধরণের পয়েন্টার রয়েছে।

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


3

আমি যা মনে করি তা থেকে এটি একটি মেমরি ঠিকানার আকারের উপর ভিত্তি করে। সুতরাং 32-বিট অ্যাড্রেস স্কিম সহ একটি সিস্টেমে, আকার 4 ফিরে আসবে, যেটি 4 বাইট।


4
এর মতো কোনও প্রয়োজন নেই। এমনকি আকারের (স্বাক্ষরবিহীন) == আকারের (স্বাক্ষরযুক্ত) প্রয়োজন নেই। কোন ইন্টি পয়েন্টারের আকার সর্বদা সংজ্ঞা অনুসারে আকার (ইন্ট *), চরের সাইজের (চর *) এর মত হবে। অন্য কোনও অনুমানের উপর নির্ভর করা বহনযোগ্যতার জন্য খারাপ ধারণা।
মিহাই লিম্বান

আহ, আমি এখন দেখতে। তথ্যের জন্য ধন্যবাদ।
ম্যাক

1
CHAR_BIT 16 বছর হলে 2 টি এখনও ফিরে আসতে পারে size আকারের () অক্ষরের সংখ্যায় গণনা করা হয়, অক্টেট নয়।
MSalters

5
@ মিহাই: সি ++ তে sizeof (unsigned int) == sizeof (signed int)এই প্রয়োজনীয়তাটি 3.9.1 / 3 এ পাওয়া যায়। "স্ট্যান্ডার্ড ধরনের পূর্ণসংখ্যা স্বাক্ষরিত প্রতিটি জন্য, একটি সংশ্লিষ্ট (কিন্তু বিভিন্ন) মান স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ বিদ্যমান: unsigned char, unsigned short int, unsigned int, unsigned long int, এবং unsigned long long int, প্রতিটি যা স্টোরেজ একই পরিমাণ দখল করে এবং টাইপ পূর্ণসংখ্যা স্বাক্ষরিত সংশ্লিষ্ট একই প্রান্তিককরণ প্রয়োজনীয়তা আছে "
বেন ভয়েগট

3

সাধারণভাবে, আপনি বিভিন্ন প্ল্যাটফর্মগুলিতে সংকলন করার সময় মাপের (খুব বেশি কিছু) পরিবর্তন হবে। 32 বিট প্ল্যাটফর্মে পয়েন্টারগুলি সর্বদা একই আকারের হয়। অন্যান্য প্ল্যাটফর্মগুলিতে (bit৪ বিট প্রকট উদাহরণ হিসাবে) এটি পরিবর্তন করতে পারে।



3

উইন্ডোজ 32 বিট মেশিনে টার্বো সি সংকলনে পয়েন্টার এবং ইন্টের আকার 2 বাইট।

পয়েন্টারের আকার তাই সংকলক নির্দিষ্ট। তবে সাধারণত সংকলকগুলির বেশিরভাগটি 32 বিটে 4 বাইট পয়েন্টার ভেরিয়েবল এবং 64 বিট মেশিনে 8 বাইট পয়েন্টার ভেরিয়েবল সমর্থন করার জন্য প্রয়োগ করা হয়।

সুতরাং পয়েন্টারের আকার সমস্ত মেশিনে এক নয়।


2

আপনার পয়েন্টারের আকার 4 বাইট হওয়ার কারণ হ'ল আপনি 32-বিট আর্কিটেকচারের জন্য সংকলন করছেন। ফ্রাইগুই যেমন উল্লেখ করেছেন, একটি 64-বিট আর্কিটেকচারে আপনি 8 দেখতে পাবেন।


2

ইন Win64 (Cygwin জিসিসি 5.4) , এর উদাহরণ নিচে দেখুন যাক:

প্রথমে নিম্নলিখিত কাঠামোটি পরীক্ষা করুন:

struct list_node{
    int a;
    list_node* prev;
    list_node* next;
};

struct test_struc{
    char a, b;
};

পরীক্ষার কোডটি নীচে রয়েছে:

std::cout<<"sizeof(int):            "<<sizeof(int)<<std::endl;
std::cout<<"sizeof(int*):           "<<sizeof(int*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(double):         "<<sizeof(double)<<std::endl;
std::cout<<"sizeof(double*):        "<<sizeof(double*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(list_node):      "<<sizeof(list_node)<<std::endl;
std::cout<<"sizeof(list_node*):     "<<sizeof(list_node*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(test_struc):     "<<sizeof(test_struc)<<std::endl;
std::cout<<"sizeof(test_struc*):    "<<sizeof(test_struc*)<<std::endl;    

আউটপুট নীচে:

sizeof(int):            4
sizeof(int*):           8

sizeof(double):         8
sizeof(double*):        8

sizeof(list_node):      24
sizeof(list_node*):     8

sizeof(test_struc):     2
sizeof(test_struc*):    8

আপনি দেখতে পারেন যে 64-বিট এ, sizeof(pointer)হয় 8


1

একটি পয়েন্টার একটি ঠিকানার জন্য একটি ধারক। একটি 32 বিট মেশিনে, আপনার ঠিকানার পরিধি 32 বিট, সুতরাং একটি পয়েন্টার সর্বদা 4 বাইট হবে। একটি 64 বিট মেশিনে আপনার 64 বিটের ঠিকানা সীমা ছিল, একটি পয়েন্টার 8 বাইট হবে।


1
32-বিট বাইট সহ 32-বিট মেশিনে, আকারের (চর *) 1 হতে পারে
রবার্ট গ্যাম্বল

"... 32-বিট বাইট সহ" আমি জানতাম না যে এই জাতীয় জিনিসগুলির অস্তিত্ব ছিল ... অভিনব
এড এস

1
32 বিট হাঁসের দিকে, আকারের (চর *) পিআই
ফেরায়

0

কেবলমাত্র সম্পূর্ণতা এবং historicতিহাসিক আগ্রহের জন্য, bit৪ বিট বিশ্বে লম্বা এবং দীর্ঘ দীর্ঘ ধরণের আকারের বিভিন্ন প্ল্যাটফর্ম সম্মেলন ছিল, যার নাম এলএলপি 64৪ এবং এলপি .৪, মূলত ইউনিক্স-টাইপ সিস্টেম এবং উইন্ডোজের মধ্যে। আইএলপি 64 নামে একটি পুরানো স্ট্যান্ডার্ডও ইনট = 64-বিট প্রশস্ত করেছে।

মাইক্রোসফ্ট LLP64 বজায় রেখেছে যেখানে দীর্ঘতম = wide৪ বিট প্রশস্ত, তবে সহজ পোর্টিংয়ের জন্য দীর্ঘ ৩২ এ রয়ে গেছে।

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

সূত্র: https://stackoverflow.com/a/384672/48026

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