তথ্য গোপন
ফাংশনের রিটার্ন স্টেটমেন্টে পুরো কাঠামোটি ফিরিয়ে দেওয়ার বিপরীতে কোনও কাঠামোর পয়েন্টার ফিরিয়ে দেওয়ার সুবিধা কী?
সর্বাধিক সাধারণ তথ্য হাইডিং । সি এর কোনও struct
প্রাইভেটের ক্ষেত্র তৈরি করার ক্ষমতা নেই , এগুলি অ্যাক্সেসের জন্য পদ্ধতি সরবরাহ করুন।
সুতরাং যদি আপনি বিকাশকারীদের পয়েন্টটির বিষয়বস্তুগুলি দেখতে পছন্দ করতে এবং ছদ্মবেশে জোর করে আটকাতে চান FILE
তবে একমাত্র এবং একমাত্র উপায় হ'ল পয়েন্টারটিকে অস্বচ্ছ হিসাবে বিবেচনা করে তার সংজ্ঞাটির সংস্পর্শে আনা থেকে বাধা দেওয়া যার পয়েন্টটির আকার এবং সংজ্ঞা বাইরের বিশ্বের অজানা। FILE
তারপরে সংজ্ঞাটি কেবল তখনই অপারেশনগুলিকে প্রয়োগ করে যার জন্য তার সংজ্ঞা প্রয়োজন তাদের fopen
পক্ষে দৃশ্যমান হবে , যেমন কেবল কাঠামোর ঘোষণাপত্র পাবলিক শিরোনামের জন্য দৃশ্যমান হবে।
বাইনারি সামঞ্জস্য
কাঠামোর সংজ্ঞাটি লুকিয়ে রাখার ফলে ডায়লিব এপিআইগুলিতে বাইনারি সামঞ্জস্যতা সংরক্ষণের জন্য শ্বাসকষ্ট সরবরাহ করতে সহায়তা করতে পারে। এটি লাইব্রেরি প্রয়োগকারীদের সাথে লাইব্রেরি ব্যবহারকারীদের সাথে বাইনারি সামঞ্জস্যতা না ভেঙে অস্বচ্ছ কাঠামোর ক্ষেত্রগুলি পরিবর্তন করতে দেয়, যেহেতু তাদের কোডের প্রকৃতিটি কেবল কাঠামোর সাথে কী করতে পারে তা জানতে হবে, এটি কতটা বড় বা কোন ক্ষেত্র নয় ইহা ছিল.
উদাহরণস্বরূপ, আমি আজ উইন্ডোজ 95 যুগের সময় নির্মিত কিছু প্রাচীন প্রোগ্রামগুলি চালাতে পারি (সর্বদা নিখুঁত নয়, তবে আশ্চর্যজনকভাবে এখনও অনেকগুলি কাজ করে)। সম্ভাবনা হ'ল সেই প্রাচীন বাইনারিগুলির কোডগুলির মধ্যে কিছু স্ট্রাকচারের জন্য অস্বচ্ছ পয়েন্টার ব্যবহার করেছেন যার আকার এবং বিষয়বস্তু উইন্ডোজ 95 যুগ থেকে পরিবর্তিত হয়েছে। তবুও প্রোগ্রামগুলি উইন্ডোজের নতুন সংস্করণে কাজ করতে থাকে যেহেতু সেগুলি কাঠামোগুলির বিষয়বস্তুগুলির সাথে প্রকাশিত হয়নি। কোনও লাইব্রেরিতে যেখানে বাইনারি সামঞ্জস্যতা গুরুত্বপূর্ণ সেখানে কাজ করার সময় ক্লায়েন্ট যা প্রকাশ করেনি তা সাধারণত পিছনের সামঞ্জস্যতা না ভেঙে পরিবর্তন করার অনুমতি দেয়।
দক্ষতা
একটি পূর্ণ কাঠামো যা নুল হয় তা ফেরা আমার পক্ষে শক্ত বা কম দক্ষ বলে মনে হয়। এটি কি বৈধ কারণ?
malloc
ইতিমধ্যে বরাদ্দকৃত ভেরিয়েবল-সাইজের বরাদ্দকারী পুলিং মেমরির চেয়ে দৃশ্যের আকারের চেয়ে অনেক কম সাধারণীকরণের মেমরির বরাদ্দকারী লোক ব্যবহার না করা না পারলে এটি সাধারণত স্ট্যাকের উপর নির্ভরযোগ্যভাবে প্রকারের জন্য উপযুক্ত হতে পারে এবং ধরে নেওয়া উচিত এটি কম দক্ষ is এই ক্ষেত্রে এটি একটি সুরক্ষা বাণিজ্য-অফ, সম্ভবত গ্রন্থাগার বিকাশকারীদের সম্পর্কিত সম্পর্কিত (ধারণা সংক্রান্ত গ্যারান্টি) বজায় রাখার অনুমতি দেয় FILE
।
কমপক্ষে পারফরম্যান্সের দৃষ্টিকোণ থেকে fopen
কোনও পয়েন্টার রিটার্ন তৈরির পক্ষে এটি বৈধ কারণ নয় কারণ কেবল NULL
ফাইলটি খোলার ব্যর্থতায় এটিই ফিরে আসবে। এটি সমস্ত সাধারণ ক্ষেত্রে কার্যকর করার পথগুলিকে ধীর করার পরিবর্তে একটি ব্যতিক্রমী দৃশ্যের অনুকূলকরণ করবে। কিছু ক্ষেত্রে NULL
শর্ত সাপেক্ষে ফিরে আসার জন্য পয়েন্টারগুলি ফেরত দেওয়ার জন্য ডিজাইনগুলি আরও সহজবোধ্য করার জন্য বৈধ উত্পাদনশীলতার কারণ থাকতে পারে ।
ফাইল অপারেশনের জন্য ওভারহেড ফাইল অপারেশনগুলির তুলনায় নিজের তুলনায় তুলনামূলকভাবে তুচ্ছ এবং ম্যানুয়ালটিকে fclose
যেভাবেই এড়ানো যায় না। সুতরাং এটি এর মতো নয় যে আমরা ক্লায়েন্টকে সংস্থানটি মুক্ত করার (ক্লোজার) ঝামেলা বাঁচাতে পারি FILE
এবং সংশ্লেষের দ্বারা মূল্য দিয়ে ফিরিয়ে দিয়ে fopen
বা ফাইলের অপারেশনগুলির আপেক্ষিক ব্যয়কে একটি গাদা বরাদ্দ এড়াতে পারফরম্যান্স বৃদ্ধির অনেক আশা করতে পারি ।
হটস্পট এবং ফিক্স
যদিও অন্যান্য ক্ষেত্রে, আমি প্রচুর অপ্রয়োজনীয় সি কোড প্রেরণ করেছি লিগ্যাসি কোডবাসে হটস্পটগুলিতে malloc
এবং অযথা বাধ্যতামূলক ক্যাশে মিস হয় এই অভ্যাসটি খুব ঘন ঘন অস্বচ্ছ পয়েন্টার ব্যবহার করে এবং অজস্রভাবে প্রচুর পরিমাণে স্তূপে বরাদ্দ দেওয়া হয় in বড় লুপ
পরিবর্তে আমি ব্যবহার করছি বিকল্প অনুশীলন হ'ল কাঠামোর সংজ্ঞাগুলি প্রকাশ করা, যদিও ক্লায়েন্টটি তাদের ছত্রভঙ্গ করে না, নামকরণের কনভেনশন স্ট্যান্ডার্ডটি ব্যবহার করে যোগাযোগ করার জন্য যে অন্য কারও ক্ষেত্রেও স্পর্শ করা উচিত নয়:
struct Foo
{
/* priv_* indicates that you shouldn't tamper with these fields! */
int priv_internal_field;
int priv_other_one;
};
struct Foo foo_create(void);
void foo_destroy(struct Foo* foo);
void foo_something(struct Foo* foo);
ভবিষ্যতে যদি বাইনারি সামঞ্জস্যের উদ্বেগ থাকে তবে আমি কেবলমাত্র প্রয়োজনের জন্য ভবিষ্যতের উদ্দেশ্যে অতিরিক্ত অতিরিক্ত জায়গা সংরক্ষণ করার পক্ষে যথেষ্ট ভাল পেয়েছি:
struct Foo
{
/* priv_* indicates that you shouldn't tamper with these fields! */
int priv_internal_field;
int priv_other_one;
/* reserved for possible future uses (emergency backup plan).
currently just set to null. */
void* priv_reserved;
};
সংরক্ষিত স্থানটি কিছুটা অপব্যয়যুক্ত তবে জীবন রক্ষাকারী হতে পারে যদি আমরা ভবিষ্যতে খুঁজে পাই Foo
যে আমাদের লাইব্রেরি ব্যবহার করে এমন বাইনারিগুলি না ভাঙ্গতে আমাদের আরও কিছু ডেটা যুক্ত করা দরকার ।
আমার মতে তথ্য আড়াল করা এবং বাইনারি সামঞ্জস্যতা সাধারণত ভেরিয়েবল-দৈর্ঘ্যের স্ট্রাক্ট ছাড়াও কাঠামোগুলির গাদা বরাদ্দের অনুমতি দেওয়ার একমাত্র শালীন কারণ (যা সর্বদা এটির প্রয়োজন হবে, বা অন্যথায় যদি ক্লায়েন্টকে বরাদ্দ দিতে হয় তবে ব্যবহার করার জন্য কিছুটা বিশ্রী হতে হবে) ভিএলএস বরাদ্দ করতে একটি ভিএলএ ফ্যাশনে স্ট্যাকের মেমরি)। এমনকি বড় স্ট্রাক্টগুলি প্রায়শই মান অনুসারে ফিরে আসার জন্য সস্তা হয় যদি এর অর্থ সফ্টওয়্যার স্ট্যাকের গরম মেমরির সাথে আরও অনেক বেশি কাজ করে। এমনকি যদি তারা সৃষ্টির মূল্য অনুসারে ফিরিয়ে দিতে সস্তা নাও হয় তবে সহজভাবে এটি করা যেতে পারে:
int foo_create(struct Foo* foo);
...
/* In the client code: */
struct Foo foo;
if (foo_create(&foo))
{
foo_something(&foo);
foo_destroy(&foo);
}
... Foo
অত্যধিক অনুলিপি হওয়ার সম্ভাবনা ছাড়াই স্ট্যাক থেকে শুরু করার জন্য। বা ক্লায়েন্ট এমনকি Foo
কোনও কারণে তারা চাইলে স্তূপে বরাদ্দ দেওয়ার স্বাধীনতা অর্জন করে ।