ব্রিফ সারসংক্ষেপ
(যা আমি উপরেও রাখব):
(0) ঠিকানা হিসাবে পয়েন্টার ভাবনা প্রায়শই একটি ভাল শেখার সরঞ্জাম এবং সাধারণ তথ্য ধরণের পয়েন্টারগুলির জন্য প্রায়শই আসল বাস্তবায়ন।
(1) তবে অনেকের পক্ষে, সম্ভবত বেশিরভাগ ক্ষেত্রে, ফাংশনগুলিতে সংকলকগুলির নির্দেশকগুলি ঠিকানা নয়, তবে কোনও ঠিকানার চেয়ে বড় (সাধারণত 2x, কখনও কখনও আরও বেশি) হয়, বা আসলে ফাংশন এবং স্টাফের ঠিকানাগুলি মেমরির কোনও কাঠামোর দিকে নির্দেশক হয় like একটি ধ্রুবক পুল।
(২) ডেটা সদস্যদের নির্দেশক এবং পদ্ধতিগুলির দিকে নির্দেশকগুলি প্রায়শই অপরিচিতও হয়ে থাকে।
(3) FAR এবং নিকটবর্তী পয়েন্টার ইস্যুগুলির সাথে লিগ্যাসি x86 কোড
(4) বেশ কয়েকটি উদাহরণ, বিশেষত IBM AS / 400, সুরক্ষিত "ফ্যাট পয়েন্টার" সহ।
আমি নিশ্চিত আপনি আরও খুঁজে পেতে পারেন।
বিস্তারিত:
UMMPPHHH !!!!! এখনও অবধি অনেক উত্তর মোটামুটি সাধারণ "প্রোগ্রামার ওয়েইনি" এর উত্তর - তবে সংকলক ওয়েইনি বা হার্ডওয়্যার ওয়েইনি নয় we যেহেতু আমি একটি হার্ডওয়্যার ওয়েইনি হওয়ার ভান করি এবং প্রায়শই কম্পাইলার ওয়েইনিসের সাথে কাজ করি, আমাকে আমার দুটি সেন্টে ফেলে দিন:
অনেকগুলিতে, সম্ভবত বেশিরভাগ, সি সংকলক, টাইপের ডেটার একটি পয়েন্টার T
প্রকৃতপক্ষে, এর ঠিকানা T
।
ফাইন।
তবে, এমনকি এর অনেকগুলি সংকলককেও, নির্দিষ্ট পয়েন্টারগুলি ঠিকানা নয়। আপনি এটি দেখে বলতে পারেন sizeof(ThePointer)
।
উদাহরণস্বরূপ, ফাংশনগুলিতে পয়েন্টারগুলি কখনও কখনও সাধারণ ঠিকানাগুলির চেয়ে বেশ বড় হয়। বা, এগুলি একটি স্তর নির্দেশনা জড়িত থাকতে পারে। এই নিবন্ধটিইন্টেল ইটানিয়াম প্রসেসরের সাথে জড়িত একটি বিবরণ সরবরাহ করে তবে আমি অন্যকে দেখেছি। সাধারণত, একটি ফাংশন কল করতে আপনাকে অবশ্যই ফাংশন কোডের ঠিকানাটিই জানতে হবে না, তবে ফাংশনটির ধ্রুবক পুলের ঠিকানাও জানতে হবে - মেমরির এমন একটি অঞ্চল যা থেকে কনস্টাইলগুলি জেনারেশনের পরিবর্তে একক লোড নির্দেশ সহ লোড করা হয় are বেশ কয়েকটি লোড তাত্ক্ষণিক এবং শিফট এবং OR নির্দেশাবলীর বাইরে একটি 64 বিট ধ্রুবক। সুতরাং, একক bit৪ বিটের ঠিকানার চেয়ে আপনার প্রয়োজন ২ 64৪ বিট ঠিকানা। কিছু এবিআই (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস) এটিকে প্রায় 128 বিট হিসাবে স্থানান্তরিত করে, অন্যরা ফাংশন পয়েন্টারটি আসলে একটি ফাংশন বর্ণনাকারীর ঠিকানা যা কেবলমাত্র উল্লিখিত 2 টি আসল ঠিকানা রয়েছে। কোনটা ভাল? আপনার দৃষ্টিকোণের উপর নির্ভর করে: কার্য সম্পাদন, কোড আকার, এবং কিছু সামঞ্জস্যের সমস্যা - প্রায়শই কোড ধরে নেওয়া হয় যে একটি পয়েন্টার দীর্ঘ বা দীর্ঘ দীর্ঘতে কাস্ট করা যেতে পারে তবে এটি ধরেও নিতে পারে যে দীর্ঘ দীর্ঘটি হ'ল 64 বিট। এই জাতীয় কোড মান মেনে চলতে না পারে তবে তবুও গ্রাহকরা এটি কাজ করতে চায়।
আমাদের অনেকের কাছে পুরাতন ইন্টেল x86 সেগমেন্টযুক্ত আর্কিটেকচারের বেদনাদায়ক স্মৃতি রয়েছে, নিকটস্থ পয়েন্টার এবং ফার পয়েন্টার সহ। ধন্যবাদ, এগুলি এখন প্রায় বিলুপ্ত হয়ে গেছে, তাই কেবলমাত্র একটি দ্রুত সংক্ষিপ্তসার: 16 বিট আসল মোডে, আসল লিনিয়ার ঠিকানাটি ছিল
LinearAddress = SegmentRegister[SegNum].base << 4 + Offset
সুরক্ষিত মোডে, এটি হতে পারে
LinearAddress = SegmentRegister[SegNum].base + offset
ফলাফলটিতে বিভাগটিতে একটি সীমা নির্ধারণের বিপরীতে পরীক্ষা করা হচ্ছে। কিছু প্রোগ্রাম সত্যই স্ট্যান্ডার্ড সি / সি ++ ফার এবং নিকটবর্তী পয়েন্টার ঘোষণা হিসাবে ব্যবহৃত হয় না, তবে অনেকেই বলেছিলেন *T
--- তবে সংকলক এবং লিঙ্কার সুইচগুলি ছিল তাই উদাহরণস্বরূপ, কোড পয়েন্টারগুলি পয়েন্টারগুলির নিকটে হতে পারে, যা আছে তার বিপরীতে মাত্র 32 বিট অফসেট সিএস (কোড সেগমেন্ট) নিবন্ধন করুন, যখন ডেটা পয়েন্টারগুলি এফআর পয়েন্টার হতে পারে, একটি 48 বিট মানের জন্য একটি 16 বিট সেগমেন্ট নম্বর এবং 32 বিট অফসেট উভয়ই নির্দিষ্ট করে। এখন, এই দুটি পরিমাণই অবশ্যই ঠিকানার সাথে সম্পর্কিত, তবে যেহেতু সেগুলি একই আকার নয়, তাদের মধ্যে ঠিকানাটি কোনটি? তদুপরি, বিভাগগুলি প্রকৃত ঠিকানার সাথে সম্পর্কিত স্টাফ ছাড়াও - কেবল পঠনযোগ্য, পঠন-লিখন, সম্পাদনযোগ্য।
আরও আকর্ষণীয় উদাহরণ, আইএমএইচও, হ'ল (বা, সম্ভবত) ছিলেন আইবিএম এএস / 400 পরিবার। এই কম্পিউটারটি সি ++ এ প্রথম কোনও ওএস প্রয়োগ করে। এই মেশিমের পয়েন্টারগুলি সাধারণত আসল ঠিকানার আকার 2X ছিল - যেমন এই উপস্থাপনাবলেছেন, 128 বিট পয়েন্টার, তবে আসল ঠিকানাগুলি 48-64 বিট ছিল এবং আবার কিছু অতিরিক্ত তথ্য, যাকে একটি সক্ষমতা বলা হয়, যা পড়ার, লেখার পাশাপাশি অনুমতি দেয় বাফার ওভারফ্লো প্রতিরোধের সীমাও। হ্যাঁ: আপনি সি / সি ++ এর সাথে এটি তুলনামূলকভাবে করতে পারেন - এবং যদি এটি সর্বব্যাপী হয় তবে চীনা পিএলএ এবং স্লাভিক মাফিয়া এতগুলি পশ্চিমা কম্পিউটার সিস্টেমে হ্যাকিং করত না। তবে historতিহাসিকভাবে বেশিরভাগ সি / সি ++ প্রোগ্রামিং পারফরম্যান্সের জন্য সুরক্ষা উপেক্ষা করেছে। সবচেয়ে মজার বিষয় হল, AS400 পরিবার অপারেটিং সিস্টেমটিকে সুরক্ষিত পয়েন্টার তৈরি করার অনুমতি দিয়েছে, এটি অনিবদ্ধ কোডে দেওয়া যেতে পারে, তবে যা অনিচ্ছাকৃত কোড জালিয়াতি বা ছলচাতুরি করতে পারে না। আবার সুরক্ষা এবং মান মেনে চলার সময় অনেকটা slালু নন-মানক সি / সি ++ কোড এই জাতীয় সুরক্ষিত সিস্টেমে কাজ করবে না। আবার, সরকারী মান আছে,
এখন, আমি আমার সুরক্ষা সাবানবক্সটি সরিয়ে ফেলব এবং এমন কিছু অন্যান্য উপায় উল্লেখ করব যাতে পয়েন্টারগুলি (বিভিন্ন ধরণের) প্রায়শই সত্যিকারের ঠিকানা হয় না: ডেটা সদস্যদের পয়েন্টার, সদস্য ফাংশন পদ্ধতিতে নির্দেশক এবং এর স্ট্যাটিক সংস্করণগুলি তার চেয়ে বড় হয় সাধারণ ঠিকানা যেমন এই পোস্টে বলেছেন:
এটি সমাধানের বিভিন্ন উপায় রয়েছে [একক বনাম একাধিক ইনহিটেন্স এবং ভার্চুয়াল উত্তরাধিকার সম্পর্কিত সমস্যা]। এখানে ভিজ্যুয়াল স্টুডিও সংকলক এটি পরিচালনা করার সিদ্ধান্ত নেয় কীভাবে: একটি বহুগুণ-উত্তরাধিকারী শ্রেণীর সদস্য ফাংশনের একটি পয়েন্টার আসলে একটি কাঠামো "
আপনি সম্ভবত (ইন) সুরক্ষার বিষয়ে আমার পন্টিফাইটিং থেকে অনুমান করতে পারেন, আমি সি / সি ++ হার্ডওয়্যার / সফ্টওয়্যার প্রকল্পের সাথে জড়িত ছিলাম যেখানে কোনও পয়েন্টারকে কাঁচা ঠিকানার চেয়ে দক্ষতার মতো আচরণ করা হয়।
আমি যেতে পারে, তবে আমি আশা করি আপনি ধারণা পাবেন।
ব্রিফ সারসংক্ষেপ
(যা আমি উপরেও রাখব):
(0) ঠিকানা হিসাবে পয়েন্টারগুলির চিন্তাভাবনা প্রায়শই একটি ভাল শেখার সরঞ্জাম, এবং প্রায়শই সাধারণ ডেটা ধরণের পয়েন্টারগুলির জন্য প্রকৃত বাস্তবায়ন।
(1) তবে অনেকের পক্ষে, সম্ভবত বেশিরভাগ ক্ষেত্রে, ফাংশনগুলিতে সংকলকগুলির নির্দেশকগুলি ঠিকানা নয়, তবে কোনও ঠিকানার চেয়ে বড় (সাধারণত 2 এক্স, কখনও কখনও আরও বেশি) হয়, বা আসলে ফাংশন এবং স্টাফের ঠিকানাগুলি মেমরির কোনও কাঠামোর দিকে নির্দেশক হয় like একটি ধ্রুবক পুল।
(২) ডেটা সদস্যদের নির্দেশক এবং পদ্ধতিগুলির দিকে নির্দেশকগুলি প্রায়শই অপরিচিতও হয়ে থাকে।
(3) FAR এবং নিকটবর্তী পয়েন্টার ইস্যুগুলির সাথে লিগ্যাসি x86 কোড
(4) বেশ কয়েকটি উদাহরণ, বিশেষত IBM AS / 400, সুরক্ষিত "ফ্যাট পয়েন্টার" সহ।
আমি নিশ্চিত আপনি আরও খুঁজে পেতে পারেন।