সিতে মান দ্বারা স্ট্রাইকগুলি পাশ করার পরিবর্তে কোনও পয়েন্টার পাস করার চেয়ে কোনও ডাউনসাইড রয়েছে?
স্ট্রাক্ট যদি বড় হয় তবে স্পষ্টতই প্রচুর ডেটা অনুলিপি করার পারফরম্যান্সড দিক রয়েছে তবে একটি ছোট স্ট্রাক্টের জন্য এটি মূলত কোনও ফাংশনে কয়েকটি মান পাস করার মতোই হওয়া উচিত।
রিটার্নের মান হিসাবে ব্যবহার করার সময় এটি আরও বেশি আকর্ষণীয় হতে পারে। সি শুধুমাত্র ফাংশন থেকে একক রিটার্ন মান আছে, তবে আপনার প্রায়শই বেশ কয়েকটি প্রয়োজন। সুতরাং একটি সহজ সমাধান হ'ল এগুলি একটি কাঠামোয় স্থাপন করা এবং এটি ফিরিয়ে দেওয়া।
এর পক্ষে বা বিপক্ষে কোনও কারণ আছে কি?
যেহেতু আমি এখানে যে বিষয়ে কথা বলছি তা সবার কাছে স্পষ্ট নাও হতে পারে, তাই আমি একটি সহজ উদাহরণ দেব।
আপনি যদি সি তে প্রোগ্রামিং করে থাকেন, আপনি তাড়াতাড়ি বা পরে এর মতো দেখতে ফাংশনগুলি লিখতে শুরু করবেন:
void examine_data(const char *ptr, size_t len)
{
...
}
char *p = ...;
size_t l = ...;
examine_data(p, l);
এটি কোনও সমস্যা নয়। একমাত্র সমস্যা হ'ল আপনাকে আপনার সহকর্মীর সাথে একমত হতে হবে যাতে প্যারামিটারগুলি ক্রম হওয়া উচিত যাতে আপনি সমস্ত কার্যক্রমে একই সম্মেলনটি ব্যবহার করেন।
আপনি যখন একই ধরণের তথ্য ফিরিয়ে দিতে চান তবে কী হবে? আপনি সাধারণত এরকম কিছু পান:
char *get_data(size_t *len);
{
...
*len = ...datalen...;
return ...data...;
}
size_t len;
char *p = get_data(&len);
এটি সূক্ষ্মভাবে কাজ করে, তবে এটি অনেক বেশি সমস্যাযুক্ত। এই বাস্তবায়নের ব্যতীত কোনও রিটার্ন মান হ'ল একটি রিটার্ন মান। উপরের দিক থেকে বলার কোনও উপায় নেই যে ফাংশনটি get_data কোন লেনটি নির্দেশ করে তা দেখার অনুমতি নেই। এবং এমন কিছুই নেই যা সংকলকটি পরীক্ষা করে তোলে যে কোনও মানটি সেই পয়েন্টারের মাধ্যমে আসলে ফিরে আসে। সুতরাং পরের মাসে, যখন অন্য কেউ কোডটি সঠিকভাবে না বুঝে সংশোধন করে (কারণ সে ডকুমেন্টেশনটি পড়ে না?) কারও নজরে না নিয়েই এটি ভেঙে যায়, বা এটি এলোমেলোভাবে ক্রাশ শুরু করে।
সুতরাং, আমি প্রস্তাবিত সমাধানটি হ'ল সহজ কাঠামো
struct blob { char *ptr; size_t len; }
উদাহরণগুলি এইভাবে আবার লেখা যেতে পারে:
void examine_data(const struct blob data)
{
... use data.tr and data.len ...
}
struct blob = { .ptr = ..., .len = ... };
examine_data(blob);
struct blob get_data(void);
{
...
return (struct blob){ .ptr = ...data..., .len = ...len... };
}
struct blob data = get_data();
কোনও কারণে, আমি মনে করি যে বেশিরভাগ লোকেরা সহজাতভাবে পরীক্ষা_ডাটা একটি কাঠামোয় একটি পয়েন্টার নিয়ে যায়, তবে কেন তা আমি দেখছি না। এটি এখনও একটি পয়েন্টার এবং একটি পূর্ণসংখ্যা পায়, এটি আরও পরিষ্কার যে তারা একসাথে চলে। এবং get_data ক্ষেত্রে আমি আগে বর্ণিতভাবে গণ্ডগোল করা অসম্ভব, যেহেতু দৈর্ঘ্যের কোনও ইনপুট মান নেই, এবং অবশ্যই একটি ফিরে দৈর্ঘ্য থাকতে হবে।
gettimeofday
) পরিবর্তে পয়েন্টার ব্যবহার করা হয়, এবং লোকেরা এটি উদাহরণ হিসাবে গ্রহণ করে।
void examine data(const struct blob)
এটি ভুল।