আকারকে কেন একটি সংকলন-সময় অপারেটর বলা হয়?


12

মূলত, এটি অন্য প্রশ্নের একটি অংশ ।

sizeofকমপাইল-টাইম অপারেটর কেন বলা হয়? এটি কি আসলে রান-টাইম অপারেটর নয়? এবং যদি এটি প্রকৃতপক্ষে একটি সংকলন-সময় অপারেটর হয় তবে পোর্টেবল কোড তৈরি করতে এটি কীভাবে সহায়তা করে যা বিভিন্ন কম্পিউটারে একই রকম চলে? বিস্তারিত ব্যাখ্যা করুন।


4
এসও-তে বিশদে জবাব দেওয়া হয়েছে: আকার (x ++) কেন এনক্রিমেন্ট এক্স নয়?
gnat

3
রানটাইমে কোনও প্রকারের আকারের পরিবর্তন আপনি কীভাবে করবেন?

@ মিশেলটি: কোনও ধরণের উদাহরণের আকার অবশ্যই পরিবর্তন করতে পারে - সর্বোপরি ক্লাস পলিমারফিজম রয়েছে। আমি যুক্তি দিয়েছি যে sizeof(polymorphic_ptr*)ধ্রুবক হওয়া বেশ পাল্টা স্বজ্ঞাত এবং কেবল নির্বোধ। হ্যাঁ, এটি সি ++ উপায়, তবুও নিরীহ।
মনিকা 20

পছন্দ করুন আমি কেবল কৌতূহলী যে ওপি কীভাবে বিভিন্ন ক্ষেত্রে এটি আচরণ করবে তা ভেবেছিলাম এবং আশা করি এমন কিছু কোড পাওয়া যাবে যা এই প্রশ্নের বিস্তারে সহায়তা করার জন্য তার বিভ্রান্তি প্রকাশ করবে would

4
উত্তরের উত্তরটি নিয়ে এসেছিল "কারণ এটি সংকলনের সময়ে পরিচালিত হয়", হতাশ বামে।
বেন জ্যাকসন

উত্তর:


23

sizeof()আপনাকে ডেটা টাইপের আকার দেয় , মেমোরিতে type ধরণের কোনও নির্দিষ্ট উদাহরণের আকার দেয় না।

উদাহরণস্বরূপ, যদি আপনার স্ট্রিং ডেটা অবজেক্ট থাকে যা রানটাইম সময়ে একটি পরিবর্তনশীল আকারের অক্ষর অ্যারে বরাদ্দ করে থাকে তবে সেই অক্ষরের অ্যারের sizeof()আকার নির্ধারণ করতে ব্যবহৃত হতে পারে না। এটি আপনাকে কেবল পয়েন্টারের আকার দেবে।

একটি ডেটা টাইপের আকার সর্বদা সংকলনের সময়ে জানা যায়।


3
সি (++) এর রান-টাইম অবজেক্ট মেটাডেটা না থাকায় আপনি আসলে চালানোর সময় সেই জিনিসগুলি পেতে পারবেন না।
সি রস

5
আসলে, যদি আপনি ব্যবহার sizeofএকটি অ্যারের, আপনি হবে অ্যারের আকার (যে উপাদান আকার বার উপাদানের সংখ্যা) পেতে। আপনি যদি এটি কোনও পয়েন্টারে ব্যবহার করেন তবে আপনি কেবল পয়েন্টারের আকার পান। সুতরাং, যেহেতু বেশিরভাগ ক্ষেত্রে যেখানে আপনি অ্যারের আকার জানতে চান সেখানে আপনার কেবলমাত্র একটি পয়েন্টার রয়েছে, এটি এতটা কার্যকর নয়।
sepp2k

1
@ জেনস প্রশ্নটি ট্যাগ হয়েছে [সি ++] এবং ভিএলএ এটিকে C ++ মান হিসাবে তৈরি করেনি।
লেখক

13

কারণ সংকলনের সময় পুরো আকারের "কল" গণনা করা হয় এবং প্রথম বন্ধনের মধ্যবর্তী যা কিছু বাতিল করা হয় এবং রানটাইমে চালানো হয় না ,

ফলাফলটি সম্পূর্ণরূপে সংকলকটিতে উপলব্ধ স্থির প্রকারের তথ্যের উপর ভিত্তি করে


7

আকারকে কেন একটি সংকলন-সময় অপারেটর বলা হয়?

কারণ, সংকলনের সময়ে, সংকলকটি প্রকাশের আকারের এবং গণ-সময় স্থির মানের সংকলনকারী বিকল্পগুলির আকার গণনা করে।

এটি কি আসলে রান-টাইম অপারেটর নয়?

না। আপনি sizeofআইনীভাবে কার্যকর করতে পারবেন না এমন অভিব্যক্তিগুলির আকার মূল্যায়নের জন্যও ব্যবহার করতে পারেন (যেমন, এটি অপরিজ্ঞাত আচরণে জড়িত হবে), যতক্ষণ সংকলকটি বুঝতে পারে যে অভিব্যক্তির প্রকারটি কী।

এছাড়াও, সি ++ 11 এর আগেও constexprআপনি sizeofরান-টাইম এক্সপ্রেশন ব্যবহার করতে পারবেন না এমন উপায়ে এক্সপ্রেশনগুলি ব্যবহার করতে পারেন ।

এবং যদি এটি প্রকৃতপক্ষে একটি সংকলন-সময় অপারেটর হয় তবে এটি কীভাবে পোর্টেবল কোড তৈরি করতে সহায়তা করে ...

বিভিন্ন প্ল্যাটফর্মগুলিতে প্রকারের আকারগুলি বিভিন্ন রকম হতে পারে। sizeofহার্ড-কোডেড অনুমানের পরিবর্তে এক্সপ্রেশন ব্যবহার করার অর্থ আপনি যখন অন্য কোনও প্ল্যাটফর্মে সংকলন করেন এবং আপনার ধরণের আকার পরিবর্তন করেন তখন আপনার কোডটি ভাঙবে না।


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

1
হ্যাঁ, কোডটি পোর্টেবল, এই অর্থে আপনি প্রতিটি প্ল্যাটফর্মের জন্য একটি (পৃথক) সঠিক বাইনারি সংকলন করতে পারেন।
অকেজো

5

সি ++ আসলে রানটাইমে অবজেক্টগুলির জন্য মেটাডেটা সঞ্চয় করে না তাই আকার চেক করতে হবে সংকলনের সময়। সি ++ কীভাবে আকারকে বৈধতা দেয় না তার উদাহরণস্বরূপ, intকিছু স্বেচ্ছাসেবক আকারের অ্যারে ঘোষণা করুন এবং এর শেষটি পড়ুন। আপনি যদি ভাগ্যবান হন তবে আপনি segfaultসম্ভবত জিব্বারিশ পড়বেন, কারণ সি ++ আপনার অ্যারের আকার ট্র্যাক করে না।

দেখুন ক্যান একটি সি / সি ++ প্রোগ্রাম একটি অ্যারের (Unix) শেষে গত পড়া থেকে seg-দোষ? SO থেকে একটি উদাহরণের জন্য।

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