ভার্চুয়াল পদ্ধতিগুলি সাধারণত তথাকথিত ভার্চুয়াল পদ্ধতি সারণীগুলির মাধ্যমে প্রয়োগ করা হয় (সংক্ষেপে vtable), যেখানে ফাংশন পয়েন্টারগুলি সংরক্ষণ করা হয়। এটি প্রকৃত কলটিতে ইন্ডিয়ারেশন যুক্ত করে (ভিটিবেল থেকে কল করার জন্য ফাংশনের ঠিকানা আনতে হবে, তারপরে ফোন করুন - ঠিক ঠিক সামনে ডাকার বিরোধিতা করুন)। অবশ্যই এতে কিছু সময় এবং আরও কিছু কোড লাগে।
যাইহোক, অভাবের প্রাথমিক কারণ এটি অগত্যা নয়। আসল সমস্যাটি হ'ল সংকলক (সাধারণত / সাধারণত) কোন ফাংশনটি ডাকা হবে তা জানতে পারে না । সুতরাং এটি এটিকে ইনলাইন করতে বা এ জাতীয় কোনও অপ্টিমাইজেশান সম্পাদন করতে পারে না। এটি এককভাবে এক ডজন নিরর্থক নির্দেশাবলী যুক্ত করতে পারে (রেজিস্টারগুলি প্রস্তুত করা, কল করা, তারপরে রাষ্ট্রটি পুনরুদ্ধার করা) এবং অন্যটিকে আপাতদৃষ্টিতে সম্পর্কিত না হওয়া অপ্টিমাইজেশন বাধা দেয়। তদুপরি, যদি আপনি অনেকগুলি বিভিন্ন বাস্তবায়ন কল করে পাগলের মতো শাখা করেন, তবে আপনি পাগলের মতো শাখাগুলি করে অন্যরকম আঘাতের দ্বারা একই আঘাত হানাবেন: ক্যাশে এবং শাখার ভবিষ্যদ্বাণী আপনাকে সাহায্য করবে না, শাখাগুলি পুরোপুরি অনুমানযোগ্য থেকে বেশি সময় নেয় শাখা।
বড় তবে : এই পারফরম্যান্স হিটগুলি গুরুত্বপূর্ণ বিষয়গুলির জন্য খুব ছোট। আপনি যদি উচ্চ-পারফরম্যান্স কোড তৈরি করতে চান এবং ভার্চুয়াল ফাংশন যুক্ত করতে চান যা ভীতিজনক ফ্রিকোয়েন্সিতে ডাকা হবে সেগুলি বিবেচনা করার মতো। যাইহোক, এছাড়াও মনে রাখবেন যে শাখাবিন্যাস অন্যান্য উপায়ে সঙ্গে ভার্চুয়াল ফাংশন কল প্রতিস্থাপন ( if .. else
, switch
, ফাংশন পয়েন্টার, ইত্যাদি) মৌলিক সমস্যা সমাধানের না - এটা খুব ভাল মন্থর হতে পারে। সমস্যাটি (এটি যদি একেবারেই বিদ্যমান থাকে) ভার্চুয়াল ফাংশন নয় তবে (অপ্রয়োজনীয়) ইন্ডিয়ারেশন।
সম্পাদনা: কল নির্দেশাবলীর পার্থক্য অন্যান্য উত্তরে বর্ণিত হয়েছে described মূলত, একটি স্ট্যাটিক ("সাধারণ") কলের কোডটি হ'ল:
- ডাকা ফাংশনটি সেই রেজিস্টারগুলি ব্যবহার করার অনুমতি দেওয়ার জন্য স্ট্যাকের কয়েকটি রেজিস্টার অনুলিপি করুন।
- পূর্বনির্ধারিত অবস্থানগুলিতে যুক্তিগুলি অনুলিপি করুন, যাতে ডাকা ফাংশনটি যেখানেই ডাকা হয় সেখান থেকে নির্বিশেষে তাদের সন্ধান করতে পারে।
- ফেরতের ঠিকানাটি পুশ করুন।
- ফাংশনের কোডটিতে শাখা / লাফ, যা একটি সংকলন-সময় ঠিকানা এবং তাই সংকলক / লিঙ্কার দ্বারা বাইনারিতে হার্ডকড করা হয়।
- পূর্বনির্ধারিত অবস্থান থেকে রিটার্নের মানটি পান এবং আমরা যে রেজিস্টারগুলি ব্যবহার করতে চাই তা পুনরুদ্ধার করুন।
ভার্চুয়াল কল ঠিক একই কাজ করে, ব্যতীত ফাংশন ঠিকানাটি সংকলন সময়ে জানা যায় না। পরিবর্তে, কয়েকটি নির্দেশাবলী ...
- ভ্যাটেবল পয়েন্টারটি পান, যা বস্তু থেকে প্রতিটি ভার্চুয়াল ফাংশনের জন্য একটি ফাংশন পয়েন্টার (ফাংশন ঠিকানা) এর অ্যারে নির্দেশ করে।
- ভিটিবেল থেকে একটি নিবন্ধে সঠিক ফাংশন ঠিকানা পান (সঠিক ফাংশন ঠিকানাটি যে সূচকটি সংরক্ষণ করা হয় তা সংকলন-সময়ে সিদ্ধান্ত নেওয়া হয়)।
- হার্ডকডযুক্ত ঠিকানায় ঝাঁপিয়ে না গিয়ে that নিবন্ধের ঠিকানায় যান।
শাখাগুলি হিসাবে: একটি শাখা এমন কিছু যা কেবলমাত্র পরবর্তী নির্দেশনাটি কার্যকর করার পরিবর্তে অন্য নির্দেশে ঝাঁপিয়ে পড়ে। এর মধ্যে রয়েছে if
, switch
বিভিন্ন লুপের কিছু অংশ, ফাংশন কল ইত্যাদি and দেখুন কেন একটি বাছাই করা অ্যারের চেয়ে দ্রুত বাছাই করা অ্যারে প্রক্রিয়াকরণ হচ্ছে? কেন এটি ধীর হতে পারে, সিপিইউগুলি এই মন্দাকে মোকাবেলায় কী করবে এবং কীভাবে এটি নিরাময়যোগ্য নয়।