উদাহরণস্বরূপ:
sizeof(char*)
ফেরৎ 4. হিসাবে নেই int*
, long long*
আমি চেষ্টা করেছি সবকিছু যে। এর ব্যতিক্রম কি আছে?
উদাহরণস্বরূপ:
sizeof(char*)
ফেরৎ 4. হিসাবে নেই int*
, long long*
আমি চেষ্টা করেছি সবকিছু যে। এর ব্যতিক্রম কি আছে?
উত্তর:
আপনি যে গ্যারান্টি পাবেন তা হ'ল sizeof(char) == 1
। গ্যারান্টি সহ অন্য কোনও গ্যারান্টি নেই sizeof(int *) == sizeof(double *)
।
অনুশীলনে, পয়েন্টারগুলি 16-বিট সিস্টেমে 2 আকারের হবে (যদি আপনি এটি সন্ধান করতে পারেন), 32-বিট সিস্টেমে 4, এবং 64-বিট সিস্টেমে 8, তবে প্রদত্ত উপর নির্ভর করে লাভ করার মতো কিছুই নেই আকার।
এমনকি একটি সরল 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 পাই।
রেমন্ড চেন এখানে এই সম্পর্কে কথা বলেছেন ।
ইতোমধ্যে পোস্ট করা তালিকার অন্য একটি ব্যতিক্রম। 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-বিট সেগমেন্টের মানগুলি নিয়ে গঠিত
আপনি যদি একটি 64-বিট মেশিনের জন্য সংকলন করেন তবে এটি 8 হতে পারে।
sizeof(char*)==1
,? তুমি কি নিশ্চিত? মানে না size(char)==1
?
প্রযুক্তিগতভাবে বলতে গেলে, সি স্ট্যান্ডার্ড কেবলমাত্র (আকার) == 1 এর গ্যারান্টি দেয় এবং বাকিটি বাস্তবায়নের উপর নির্ভর করে। তবে আধুনিক x86 আর্কিটেকচারে (যেমন ইন্টেল / এএমডি চিপস) এটি মোটামুটি অনুমানযোগ্য।
আপনি সম্ভবত শুনেছেন যে প্রসেসরগুলি 16-বিট, 32-বিট, 64-বিট, ইত্যাদি হিসাবে বর্ণিত হয়েছে এটির অর্থ সাধারণত প্রসেসরটি পূর্ণসংখ্যার জন্য এন-বিট ব্যবহার করে। যেহেতু পয়েন্টারগুলি মেমরি ঠিকানাগুলি সঞ্চয় করে এবং মেমোরি ঠিকানাগুলি পূর্ণসংখ্যা হয় তাই এটি আপনাকে কার্যকরভাবে জানায় যে পয়েন্টারগুলির জন্য কতগুলি বিট ব্যবহৃত হবে। আকারটি সাধারণত বাইটে পরিমাপ করা হয়, সুতরাং 32-বিট প্রসেসরের জন্য সংকলিত কোড পয়েন্টারগুলির আকার 4 (32 বিট / 8 বিট প্রতি বিট) হবে এবং 64-বিট প্রসেসরের কোডগুলি পয়েন্টারগুলির আকার 8 হবে বলে প্রতিবেদন করবে (64 বিট / 8 বিট প্রতি বিট) এখান থেকে ৩২-বিট প্রসেসরের 4 গিগাবাইট র্যামের সীমাবদ্ধতাটি আসে - প্রতিটি মেমরি ঠিকানা যদি বাইটের সাথে মিলে যায় তবে আরও মেমরির ঠিকানা দিতে আপনার 32-বিটের চেয়ে বড় পূর্ণসংখ্যার প্রয়োজন।
পয়েন্টারের আকার মূলত এটি প্রয়োগ করা সিস্টেমের আর্কিটেকচারের উপর নির্ভর করে। উদাহরণস্বরূপ, 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 বাইট হতে দেখি।
16/32/64 বিট পার্থক্য ছাড়াও বিজোড় জিনিসগুলি ঘটতে পারে।
এমন মেশিন রয়েছে যেখানে সাইজফ (ইন্টি *) এক মান হবে, সম্ভবত 4 কিন্তু যেখানে সাইজের (চর *) বড় larger মেশিনগুলি যে বাইটের পরিবর্তে শব্দগুলিকে স্বাভাবিকভাবে সম্বোধন করে সেগুলিকে সি বা সি ++ স্ট্যান্ডার্ডটি সঠিকভাবে প্রয়োগ করার জন্য শব্দের কোন অংশটি আপনি সত্যই চান তা নির্দিষ্ট করতে "বর্ধন" করতে হবে character
হার্ডওয়্যার ডিজাইনাররা বাইট অ্যাড্রেসিবিলিটির মান শিখেছেন বলে এটি এখন অত্যন্ত অস্বাভাবিক।
void*
এবং char*
সফ্টওয়্যারটিতে পরিচালনা করা হয় এবং শব্দটির মধ্যে 3 বিট অফসেট যুক্ত হয় - তবে যেহেতু প্রকৃতপক্ষে কোনও 64-বিট অ্যাড্রেস স্পেস নেই তাই অফসেটটি 64-বিটের হাই-অর্ডার 3 বিটগুলিতে সঞ্চিত রয়েছে শব্দ। সুতরাং char*
এবং int*
একই আকার, তবে বিভিন্ন অভ্যন্তরীণ উপস্থাপনা আছে - এবং কোড যা ধরে নিয়েছে যে পয়েন্টারগুলি "সত্যই" ঠিক পূর্ণসংখ্যাগুলি খারাপভাবে ব্যর্থ হতে পারে।
8 বিট এবং 16 বিট পয়েন্টার বেশিরভাগ লো প্রোফাইল মাইক্রোকন্ট্রোলারগুলিতে ব্যবহৃত হয়। এর অর্থ প্রতিটি ওয়াশিং মেশিন, মাইক্রো, ফ্রিজ, পুরানো টিভি এবং এমনকি গাড়ি।
আপনি বলতে পারেন রিয়েল ওয়ার্ল্ড প্রোগ্রামিংয়ের সাথে এগুলির কোনও সম্পর্ক নেই। তবে এখানে একটি বাস্তব বিশ্বের উদাহরণ রয়েছে: 1-2 বাইট পয়েন্টার সহ 1-2-4k র্যাম (চিপের উপর নির্ভরশীল) এর সাথে আরডুইনো।
এটি সাম্প্রতিক, সস্তা, সবার জন্য অ্যাক্সেসযোগ্য এবং কোডিংয়ের মূল্য।
লোকেরা 64৪-বিট (বা যাই হোক না কেন) সিস্টেম সম্পর্কে যা বলেছে তা ছাড়াও পয়েন্টার-টু-অবজেক্টের চেয়ে অন্য ধরণের পয়েন্টার রয়েছে।
পয়েন্টার-টু-মেম্বার প্রায় কোনও আকারের হতে পারে, এটি নির্ভর করে যে তারা আপনার সংকলক দ্বারা কীভাবে প্রয়োগ করা হয়: এগুলি অগত্যা সমস্ত আকারও নয়। একটি POD বর্গের পয়েন্টার-টু-সদস্য চেষ্টা করুন এবং তারপরে একাধিক বেস সহ একটি শ্রেণীর বেস ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত পয়েন্টার-থেকে সদস্য। কি মজা.
আমি যা মনে করি তা থেকে এটি একটি মেমরি ঠিকানার আকারের উপর ভিত্তি করে। সুতরাং 32-বিট অ্যাড্রেস স্কিম সহ একটি সিস্টেমে, আকার 4 ফিরে আসবে, যেটি 4 বাইট।
sizeof (unsigned int) == sizeof (signed int)
এই প্রয়োজনীয়তাটি 3.9.1 / 3 এ পাওয়া যায়। "স্ট্যান্ডার্ড ধরনের পূর্ণসংখ্যা স্বাক্ষরিত প্রতিটি জন্য, একটি সংশ্লিষ্ট (কিন্তু বিভিন্ন) মান স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ বিদ্যমান: unsigned char
, unsigned short int
, unsigned int
, unsigned long int
, এবং unsigned long long int
, প্রতিটি যা স্টোরেজ একই পরিমাণ দখল করে এবং টাইপ পূর্ণসংখ্যা স্বাক্ষরিত সংশ্লিষ্ট একই প্রান্তিককরণ প্রয়োজনীয়তা আছে "
না, স্থাপত্যের উপর নির্ভর করে পয়েন্টারের আকার পৃথক হতে পারে। ব্যতিক্রম অনেক আছে।
উইন্ডোজ 32 বিট মেশিনে টার্বো সি সংকলনে পয়েন্টার এবং ইন্টের আকার 2 বাইট।
পয়েন্টারের আকার তাই সংকলক নির্দিষ্ট। তবে সাধারণত সংকলকগুলির বেশিরভাগটি 32 বিটে 4 বাইট পয়েন্টার ভেরিয়েবল এবং 64 বিট মেশিনে 8 বাইট পয়েন্টার ভেরিয়েবল সমর্থন করার জন্য প্রয়োগ করা হয়।
সুতরাং পয়েন্টারের আকার সমস্ত মেশিনে এক নয়।
আপনার পয়েন্টারের আকার 4 বাইট হওয়ার কারণ হ'ল আপনি 32-বিট আর্কিটেকচারের জন্য সংকলন করছেন। ফ্রাইগুই যেমন উল্লেখ করেছেন, একটি 64-বিট আর্কিটেকচারে আপনি 8 দেখতে পাবেন।
ইন 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
।
একটি পয়েন্টার একটি ঠিকানার জন্য একটি ধারক। একটি 32 বিট মেশিনে, আপনার ঠিকানার পরিধি 32 বিট, সুতরাং একটি পয়েন্টার সর্বদা 4 বাইট হবে। একটি 64 বিট মেশিনে আপনার 64 বিটের ঠিকানা সীমা ছিল, একটি পয়েন্টার 8 বাইট হবে।
কেবলমাত্র সম্পূর্ণতা এবং 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