আমি একটি বন্য অনুমান গ্রহণ করব:
সি ++ কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর মোটেই ফাংশন নয়: এগুলি ম্যাক্রো। বস্তুটি যেখানে তৈরি করা হয় সেখানে এবং বস্তুটি যেখানে বিনষ্ট হয় তার সুযোগগুলিতে তারা inুকে পড়ে। ঘুরে দেখা যায়, কোনও নির্মাণকারী বা ধ্বংসকারী নেই, কেবলমাত্র বস্তুটি।
প্রকৃতপক্ষে, আমি মনে করি ক্লাসের অন্যান্য ক্রিয়াকলাপগুলি কোনওটিই ফাংশন নয়, তবে ইনলাইন ফাংশনগুলি অন্তর্ভুক্ত নয় কারণ আপনি সেগুলির ঠিকানা নেন (সংকলকটি বুঝতে পারে যে আপনি এটিতে আছেন এবং কোডটি ইনলাইন করে না বা ফাংশনে কোডটি ইনলাইন করে না এবং এই ফাংশনটি অনুকূল করে) এবং ফলস্বরূপ ফাংশনটি "এখনও উপস্থিত রয়েছে" বলে মনে হয়, যদিও আপনি যদি এটির ঠিকানা না নিয়ে থাকেন তবে তা হবে না।
সি ++ "অবজেক্ট" এর ভার্চুয়াল টেবিলটি কোনও জাভাস্ক্রিপ্ট অবজেক্টের মতো নয়, যেখানে আপনি এটির 'কন্সট্রাক্টর পেতে পারেন এবং রানটাইমের মাধ্যমে এটি থেকে অবজেক্ট তৈরি করতে পারবেন new XMLHttpRequest.constructor
, বরং বেনামে ফাংশনগুলির জন্য পয়েন্টারগুলির একটি সংগ্রহ যা এই বস্তুর সাথে ইন্টারফেস করার উপায় হিসাবে কাজ করে , অবজেক্ট তৈরির ক্ষমতা বাদ দিয়ে। এবং অবজেক্টটি "মুছে ফেলা" এমনকি এমনকি এটি কোনও কাঠামো মোছার চেষ্টা করার মতোও বোঝায় না, এটি আপনি পারবেন না: এটি কেবল একটি স্ট্যাক লেবেল, অন্য লেবেলের নীচে দয়া করে এটি লিখুন: আপনি স্বাধীন 4 টি পূর্ণসংখ্যা হিসাবে একটি শ্রেণি ব্যবহার করুন:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
কোনও মেমরি ফাঁস নেই, কোনও সমস্যা নেই, আপনি কার্যকরভাবে স্ট্যাক স্পেসের একগুচ্ছ অপচয় করে যা বস্তুটির ইন্টারফেসিং এবং স্ট্রিংয়ের জন্য সংরক্ষিত রয়েছে তবে এটি আপনার প্রোগ্রামটিকে ধ্বংস করতে যাচ্ছে না (যতক্ষণ আপনি এটি ব্যবহার করার চেষ্টা করবেন না) আবার কখনও স্ট্রিং হিসাবে)।
আসলে, যদি আমার পূর্ববর্তী অনুমানগুলি সঠিক হয়: স্ট্রিংয়ের সম্পূর্ণ ব্যয় হ'ল এই 32 বাইট এবং ধ্রুব স্ট্রিং স্পেসটি সংরক্ষণ করার জন্য ব্যয়: ফাংশনগুলি কেবল সংকলনের সময় ব্যবহৃত হয়, এবং পাশাপাশি ইনলাইন করা এবং টস করা হতে পারে অবজেক্টটি তৈরি এবং ব্যবহৃত হয় (যেন আপনি কোনও স্ট্রাক্টের সাথে কাজ করছেন এবং কেবল কোনও ফাংশন কল ছাড়াই সরাসরি এটি উল্লেখ করেছেন, নিশ্চিত যে ফাংশন জাম্পের পরিবর্তে ডুপ্লিকেট কল রয়েছে তবে এটি সাধারণত দ্রুত এবং কম স্থান ব্যবহার করে)। প্রকৃতপক্ষে, আপনি যখনই কোনও ফাংশন কল করেন, সংকলক কেবল সেই কলটির পরিবর্তে ভাষা কলাকুশলীদের নির্ধারিত ব্যতিক্রমগুলি সহ আক্ষরিকভাবে এটি করার নির্দেশাবলীর সাথে প্রতিস্থাপন করে।
সংক্ষিপ্তসার: সি ++ অবজেক্টের তারা কী তা কোনও ধারণা নেই; তাদের সাথে ইন্টারফেস করার জন্য সমস্ত সরঞ্জাম স্থিতিশীলভাবে ইনলাইন করা হয়, এবং রানটাইমে হারিয়ে যায়। এটি ক্লাসগুলির সাথে ডেটা দিয়ে স্ট্রাকগুলি পূরণ করার মতো দক্ষ করে তোলে এবং কোনও ফাংশনকে কোনও কল না করে সরাসরি সেই ডেটা দিয়ে কাজ করে (এই ফাংশনগুলিকে অন্তর্ভুক্ত করা হয়)।
এটি COM / ObjectiveC এর পাশাপাশি জাভাস্ক্রিপ্টের পদ্ধতির থেকে সম্পূর্ণ আলাদা, যা রানটাইম ওভারহেড, মেমরি ম্যানেজমেন্ট, নির্মাণের কলগুলিতে প্রকারের তথ্যকে গতিময়ভাবে ধরে রাখে, কারণ সংকলক এই তথ্যটি ফেলে দিতে পারে না: এটি প্রয়োজনীয় গতিশীল প্রেরণের জন্য। ফলস্বরূপ এটি আমাদের রানটাইমে আমাদের প্রোগ্রামে "আলাপ" করার ক্ষমতা দেয় এবং প্রতিচ্ছবিযুক্ত উপাদানগুলি রেখে চলমান চলাকালীন এটি বিকাশ করে।