মেমসেটের ওপরে কেন বেজারো ব্যবহার করবেন?


156

সিস্টেমস প্রোগ্রামিং ক্লাসে আমি এই পূর্বের সেমিস্টারটি নিয়েছিলাম, সিতে একটি মৌলিক ক্লায়েন্ট / সার্ভার বাস্তবায়ন করতে হয়েছিল, স্ট্রাক্টগুলি, যেমন sock_addr_in, বা চর বাফারগুলি শুরু করার সময় (আমরা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা পিছনে পিছনে প্রেরণ করতাম) অধ্যাপককে আমাদের কেবলমাত্র ব্যবহার করার নির্দেশ দেয় bzeroএবং memsetসেগুলি আরম্ভ করার জন্য নয়। তিনি কখনই ব্যাখ্যা করেননি কেন, এবং আমি যদি কৌতূহল করি যে এর কোনও কার্যকর কারণ আছে?

আমি এখানে দেখছি: http://fdiv.net/2009/01/14/memset-vs-bzero- মাল্টি- শোডাউন যে bzeroকেবলমাত্র স্মৃতিশক্তি শূন্যের হয়ে চলেছে তার কারণে আরও দক্ষ, তাই এটি হয় না করতে পারে এমন কোনও অতিরিক্ত চেকিং memsetকরতে হবে। এটি এখনও memsetঅবিচ্ছিন্নভাবে মেমরির শূন্যের জন্য একেবারে ব্যবহার না করার কারণ বলে মনে হচ্ছে না ।

bzeroঅবজ্ঞাত হিসাবে বিবেচিত হয় এবং তদুপরি, এটি একটি স্ট্যান্ডার্ড সি ফাংশন নয়। ম্যানুয়াল অনুসারে, এই কারণে memsetপছন্দ করা হয় bzero। সুতরাং কেন আপনি এখনও ব্যবহার করতে চান bzeroউপর memset? কেবল দক্ষতা লাভের জন্য, না এটি আরও কিছু? অনুরূপভাবে, সুবিধা কি কি memsetউপর bzeroএটি নতুন প্রোগ্রামের জন্য কার্যত পছন্দের করা?


28
"মেমসেটের উপরে কেন বেজারো ব্যবহার করবেন?" - না। মেমসেটটি স্ট্যান্ডার্ড, বেজারো নয়।

30
bzero একটি BSDism ()। মেমসেট () হ'ল আনসি-সি। আজকাল, বেজারো () সম্ভবত ম্যাক্রো হিসাবে প্রয়োগ করা হবে। আপনার অধ্যাপককে নিজেকে শেভ করতে এবং কিছু বই পড়তে বলুন। দক্ষতা একটি জাল-যুক্তি। একটি স্কাইল বা কনটেক্সট-স্যুইচ সহজেই কয়েক হাজার ক্লক টিকের জন্য ব্যয় করতে পারে, একটি বাফারের উপর দিয়ে একটি পাস বাসের গতিতে চলে। আপনি যদি নেটওয়ার্ক-প্রোগ্রামগুলি অনুকূল করতে চান:
সাইস্কেলের

7
memset"কিছুটা আরও যাচাই করা" থাকায় যে ধারণাটি সামান্য কম দক্ষ হতে পারে তা অবশ্যই অকালীন অপ্টিমাইজেশনের ক্ষেত্রে: আপনি সিপিইউ নির্দেশিকা বা দুটি বাদ দিতে যেই লাভ দেখতে পান তা লাভজনক নয় যখন আপনি আপনার বহনযোগ্যতার ক্ষতি করতে পারেন কোড। bzeroঅপ্রচলিত, এবং এটি ব্যবহার না করার যথেষ্ট কারণ।
ডেসব্লিংকনলাইট

4
প্রায়শই, আপনি পরিবর্তে একটি প্রাথমিক izer = {0} `যোগ করতে পারেন, এবং কোনও ফাংশনকে একেবারেই কল করতে পারেন না। এটি আরও সহজ হয়ে উঠল যখন শতাব্দীর সিটির প্রায় শেষের দিকে স্থানীয় ভেরিয়েবলগুলির আপ-ফ্রন্ট ডিক্লেয়ারেশনটির প্রয়োজনীয়তা বন্ধ হয়ে যায়। কিছু সত্যিকারের পুরানো কাগজপত্রগুলি যদিও আগের শতাব্দীতে গভীরভাবে আটকে রয়েছে।
MSalters

1
@SSAnne কোন, কিন্তু এটা সম্ভবত অবশ্যই সে প্রভাবিত করেছিল একটি প্রস্তাবিত বই থেকে, সম্ভূত নীচে উত্তর এক উল্লেখ করেছে: stackoverflow.com/a/17097072/1428743
PseudoPsyche

উত্তর:


152

আমি bzeroবেশি পছন্দ করার কোনও কারণ দেখছি না memset

memsetএটি একটি স্ট্যান্ডার্ড সি ফাংশন যখন bzeroকখনও কোনও সি স্ট্যান্ডার্ড ফাংশন হয় না। যুক্তি সম্ভবত কারণ আপনি ফাংশন ব্যবহার করে ঠিক একই কার্যকারিতা অর্জন করতে পারেন memset

দক্ষতা সম্পর্কে এখন, gccবিল্টইন বাস্তবায়ন যেমন ব্যবহারকারীর সংকলকগুলির জন্য memsetএকটি ধ্রুবক 0সনাক্ত করা হয় তখন কোনও নির্দিষ্ট প্রয়োগের দিকে চলে যায়। glibcবিল্টিনগুলি যখন অক্ষম থাকে তখন একই ।


ধন্যবাদ। এইবার বুঝতে পারছি. আমি বেশ নিশ্চিত ছিলাম যে memsetএই ক্ষেত্রে সর্বদা ব্যবহার করা উচিত, তবে আমরা কেন এটি ব্যবহার করছি না তা নিয়ে বিভ্রান্ত হয়ে পড়েছিলাম । স্পষ্ট করার জন্য, এবং আমার চিন্তাগুলি পুনরায় নিশ্চিত করার জন্য ধন্যবাদ।
সিউডোপাইচে

1
ভাঙা bzeroবাস্তবায়নে আমার অনেক সমস্যা হয়েছে। অ-বিন্যস্ত অ্যারেগুলিতে এটি প্রদত্ত দৈর্ঘ্যটি ওভারশুট করতে এবং আরও কিছু বাইট শূন্য করতে ব্যবহৃত হত। স্যুইচ করার পরে কখনও এ জাতীয় সমস্যা হয়নি memset
rustyx

memset_sকোনটি ব্যবহার করা উচিত তা ভুলে যাবেন না যদি আপনি সুরক্ষার সাথে সম্পর্কিত কিছু উদ্দেশ্যে (যেমন মেমরির একটি অঞ্চলকে ফাঁকা করে আউট করার মতো সংবেদী থাকে) সংকলকটি নিঃশব্দে "স্ক্রাব" মেমরির কলটি অপ্টিমাইজ করে না - তা নিশ্চিত করতে চান তবে ক্লিয়ারটেক্সট পাসওয়ার্ডের মতো তথ্যের টুকরো)।
ক্রিস্টোফার শুল্টজ

69

আমি অনুমান করছি আপনি ডাব্লু রিচার্ড স্টিভেনস দ্বারা ইউনিক্স নেটওয়ার্ক প্রোগ্রামিং ব্যবহার করেছেন (বা আপনার শিক্ষক দ্বারা প্রভাবিত হয়েছিল) । এমনকি তার সর্বাধিক আধুনিক সংস্করণে bzeroপরিবর্তে তিনি প্রায়শই ব্যবহার করেন memset। বইটি এত জনপ্রিয়, আমি মনে করি এটি নেটওয়ার্ক প্রোগ্রামিংয়ের একটি প্রতিমা হয়ে উঠেছে, এজন্য আপনি এখনও এটি ব্যবহার দেখতে পাচ্ছেন।

আমি memsetকেবল এই কারণে আটকে থাকি কারণ bzeroহ্রাস করা এবং বহনযোগ্যতা হ্রাস করা হয়। আমি সন্দেহ করি যে আপনি একে অপরকে ব্যবহার করে কোনও বাস্তব লাভ দেখতে পাবেন।


4
আপনি সঠিক হবে। এই কোর্সের জন্য আমাদের কাছে পাঠ্যপুস্তকের দরকার ছিল না, তবে আমি কেবল আবার সিলেবাসটি পরীক্ষা করেছিলাম এবং ইউএনআইএক্স নেটওয়ার্ক প্রোগ্রামিংটি অবশ্যই একটি anচ্ছিক সংস্থান হিসাবে তালিকাভুক্ত হয়েছে। ধন্যবাদ।
সিউডোপাইচে

9
এটি আসলে এর চেয়ে খারাপ। এটি POSIX.1-2-2001 এ হ্রাস করা হয়েছে এবং POSIX.1-2-2008 এ সরানো হয়েছে।
paxdiablo

9
ডব্লিউ। রিচার্ড স্টিভেনস দ্বারা ইউএনআইএক্স নেটওয়ার্ক প্রোগ্রামিংয়ের তৃতীয় সংস্করণের 8 পৃষ্ঠার উদ্ধৃতি দিয়েছিলেন - প্রকৃতপক্ষে, টিসিপিভি 3 এর লেখক প্রথম মুদ্রণের 10 টি ঘটনায় স্মৃতিচারণ করতে দ্বিতীয় এবং তৃতীয় যুক্তি অদলবদল করতে ভুল করেছিলেন। এসি সংকলক এই ত্রুটিটি ধরতে পারে না কারণ উভয় ঘটনা একই রকম ... এটি একটি ত্রুটি ছিল এবং বেজারো ব্যবহার করা এড়ানো যেত, কারণ ফাংশন প্রোটোটাইপগুলি ব্যবহার করা হলে দুটি আর্গুমেন্টকে বেজারোতে অদলবদল করে সর্বদা সি সংকলক দ্বারা ধরা পড়বে। তবে প্যাক্সিডিয়াবলো যেমন উল্লেখ করেছেন, বেজারো হ্রাস করা হয়েছে।
অ্যারন নিউটন

অ্যারোন নিউটন, মাইকেল এর উত্তরে আপনার এটি যোগ করা উচিত কারণ তিনি যা বলেছেন তা নিশ্চিত করে।
সিনিটেক

52

একটি সুবিধা আমি মনে করি যে bzero()উপরে রয়েছে memset()শূন্য মেমরি সেট করার জন্য সেখানে ভুল একটি হ্রাস সুযোগ তৈরি করা হচ্ছে ব্যবহার যোগ্য।

একাধিকবার আমি এমন বাগটি দেখতে পেল যা দেখতে দেখতে দেখতে:

memset(someobject, size_of_object, 0);    // clear object

সংকলকটি অভিযোগ করবে না (যদিও কিছু সংক্ষেপকারীদের উপর কিছু সতর্কতা স্তর ক্র্যাঙ্ক করা হতে পারে) এবং এর প্রভাবটি হবে যে স্মৃতিটি সাফ হয়নি। কারণ এটি বস্তুটি ট্র্যাশ করে না - এটি কেবল এটি একা ফেলে দেয় - এর একটি শালীন সম্ভাবনা রয়েছে যা সম্ভবত বাগটি কোনও স্পষ্ট কিছুতে প্রকাশ পায় না।

bzero()মান যে সত্য নয় তা একটি ক্ষুদ্র বিরক্তিজনক। (এফডাব্লুআইডাব্লু, যদি আমার প্রোগ্রামগুলিতে বেশিরভাগ ফাংশন কলগুলি মানহীন হয় তবে আমি অবাক হব না; বাস্তবে এই জাতীয় ফাংশনগুলি লেখাই আমার কাজ of

এখানে অন্য উত্তরে একটি মন্তব্যে অ্যারন নিউটন ইউনিক্স নেটওয়ার্ক প্রোগ্রামিং, খণ্ড ১, স্টিভেনস দ্বারা তৃতীয় সংস্করণ, ইত্যাদি, বিভাগ ১.২ (জোর দেওয়া) থেকে উদ্ধৃত করেছেন:

bzeroকোনও এএনএসআই সি ফাংশন নয়। এটি বার্কেলি নেটওয়ার্কের প্রাথমিক কোড থেকে প্রাপ্ত। তবুও, আমরা এএনএসআই সি memsetফাংশনের পরিবর্তে পাঠ্য জুড়েই এটি ব্যবহার করি , কারণ (তিনটি যুক্তি সহ bzero) কেবল memset( কেবল দুটি যুক্তি দিয়ে) মনে রাখা সহজ । সকেট এপিআই সমর্থন করে এমন প্রায় প্রতিটি বিক্রেতাও সরবরাহ করে bzeroএবং যদি না হয় তবে আমরা আমাদের unp.hশিরোনামে ম্যাক্রো সংজ্ঞা সরবরাহ করি ।

প্রকৃতপক্ষে, টিসিপিভি 3 এর লেখক [টিসিপি / আইপি ইলাস্ট্রেটেড, খণ্ড 3 - স্টিভেনস 1996] memsetপ্রথম মুদ্রণের সময় 10 টির মধ্যে দ্বিতীয় এবং তৃতীয় যুক্তি অদলবদল করতে ভুল করেছিলেন । এসি সংকলক এই ত্রুটিটি ধরতে পারে না কারণ উভয় যুক্তিই একই ধরণের। (প্রকৃতপক্ষে, দ্বিতীয় আর্গুমেন্টটি একটি intএবং তৃতীয় আর্গুমেন্ট size_t, যা সাধারণত একটি unsigned int, তবে নির্দিষ্ট মান, 0 এবং 16 যথাক্রমে, অন্য ধরণের আর্গুমেন্টের জন্য এখনও গ্রহণযোগ্য)) memsetএখনও কাজ করার জন্য কলটি শুধুমাত্র একটি কারণ সকেটের কয়েকটি ফাংশনটির জন্য আসলে একটি ইন্টারনেট সকেট অ্যাড্রেস স্ট্রাকচারের চূড়ান্ত 8 বাইট 0 এ সেট করা দরকার। তবুও এটি একটি ত্রুটি ছিল এবং এটির সাহায্যে এড়ানো যেতে পারে bzero, কারণ bzeroফাংশন প্রোটোটাইপগুলি ব্যবহার করা হয় তবে দুটি আর্গুমেন্ট অদলবদল সর্বদা সি সংকলক দ্বারা ধরা হবে।

আমি আরও বিশ্বাস করি যে কলগুলির সিংহভাগ কলগুলি memset()শূন্য মেমরির, সুতরাং কেন এমন কোনও API ব্যবহার করবেন না যা সেই ব্যবহারের ক্ষেত্রে উপযুক্ত?

এর একটি সম্ভাব্য অসুবিধা bzero()হ'ল সংকলকরা সম্ভবত এটি অপ্টিমাইজ করার সম্ভাবনা বেশি memcpy()কারণ এটি স্ট্যান্ডার্ড এবং তাই এটি এটি সনাক্ত করতে লেখা হতে পারে। তবে, মনে রাখবেন যে সঠিক কোডটি অপটিমাইজ করা হয়েছে এমন ভুল কোডের চেয়ে এখনও ভাল। বেশিরভাগ ক্ষেত্রে, ব্যবহার bzero()করা আপনার প্রোগ্রামের পারফরম্যান্সের উপর লক্ষণীয় প্রভাব ফেলবে না এবং এটি bzero()কোনও ম্যাক্রো বা ইনলাইন ফাংশন হতে পারে যা প্রসারিত হবে memcpy()


হ্যাঁ, আমি মনে করি এটি ক্লাসরুমের সেটিংয়ে কাজ করার সময় এটি একটি যুক্তি হতে পারে, যাতে এটি শিক্ষার্থীদের পক্ষে সম্ভাব্যভাবে কম বিভ্রান্তিকর হয়। তবে আমার প্রফেসরের ক্ষেত্রে এটি ছিল বলে আমি মনে করি না। তিনি খুব বড় আরটিএফএম শিক্ষক ছিলেন। আপনার যদি ম্যানুয়ালটির দ্বারা উত্তর দিতে পারে এমন কোনও প্রশ্ন থাকে, তবে তিনি শ্রেণিতে প্রজেক্টরের ম্যান পৃষ্ঠাগুলি টানতেন এবং আপনাকে দেখাতেন। তিনি প্রত্যেকের মনে এই বিষয় সম্পর্কে ধারণা জাগ্রত করেছিলেন যে আপনার বেশিরভাগ প্রশ্নের উত্তর পড়তে হবে এবং ম্যানুয়ালটি পড়তে হবে। আমি এর জন্য কৃতজ্ঞ, অন্য কিছু অধ্যাপকের বিপরীতে।
সিউডোপাইচে

5
আমি মনে করি এটি একটি যুক্তি যা এমনকি শ্রেণিকক্ষের বাইরেও তৈরি করা যেতে পারে - আমি এই বাগটি প্রোডাকশন কোডে দেখেছি। এটি করা সহজ ভুল হিসাবে আমাকে আঘাত করে। আমি আরও অনুমান করতে পারি যে memset()কলগুলির সংখ্যাগরিষ্ঠতা কেবল মেমরির একটি ব্লক শূন্য করা, যা আমি মনে করি এটির পক্ষে আরও একটি যুক্তি bzero()। 'বি' কীভাবে bzero()দাঁড়াবে?
মাইকেল বুড়

7
+1 টি। এটি memset"বাফার, বাফার_সাইজ" এর একটি সাধারণ প্যারামিটার ক্রমকে লঙ্ঘন করে এটি বিশেষত ত্রুটি-প্রবণ আইএমও করে তোলে।
জেমসডলিন

পাস্কলে তারা এটিকে "ফিলচার" বলে এড়িয়ে চলে এবং এটি একটি গৃহস্থালি লাগে। বেশিরভাগ সি / সি ++ সংকলকরা এটি তুলবে। যেটি আমাকে বিস্মিত করে যে সংকলকরা কেন "আপনি একটি 32/64 বিট পয়েন্টার যেখানে একটি বাইট প্রত্যাশা করা হচ্ছে" তা বলছেন না এবং সংকলক ত্রুটিগুলিতে আপনাকে দৃ kick়ভাবে লাথি মারবে।
Moz

1
@ জিউর দ্বিতীয় এবং তৃতীয় যুক্তি ভুল ক্রমে; উদ্ধৃত ফাংশন কল ঠিক কিছুই
ইছথিও

4

বেজারো বনাম মেমসেট আর্গুমেন্ট সম্পর্কে কিছু উল্লেখ করতে চেয়েছিলেন। Ltrace ইনস্টল করুন এবং তারপরে এটি হুডের নীচে কী করে তা তুলনা করুন। লিনাক্সে libc6 (2.19-0ubuntu6.6) সহ, কলগুলি ঠিক একই রকম (মাধ্যমে ltrace ./test123):

long m[] = {0}; // generates a call to memset(0x7fffefa28238, '\0', 8)
int* p;
bzero(&p, 4);   // generates a call to memset(0x7fffefa28230, '\0', 4)

আমাকে বলা হয়েছে যে আমি libc এর গভীর অন্ত্রে বা কার্নেল / সিস্কেল ইন্টারফেসের কয়েকটি সংখ্যায় কাজ না করা পর্যন্ত আমাকে এগুলি নিয়ে চিন্তা করার দরকার নেই। আমার কেবলমাত্র চিন্তিত হওয়া উচিত হ'ল কলটি বাফারের শূন্যের প্রয়োজনীয়তা পূরণ করে। অন্যরা উল্লেখ করেছে যে কোনটি অপরটির চেয়ে বেশি পছন্দনীয় তাই আমি এখানেই থামব।


এটি ঘটে কারণ জিসিসির কিছু সংস্করণগুলি memset(ptr, 0, n)যখন দেখবে তার কোড নির্গত করবে bzero(ptr, n)এবং তারা এটিকে ইনলাইন কোডে রূপান্তর করতে পারবে না।
zwol

@zwol এটি আসলে ম্যাক্রো।
এসএস আন

1
আমার কম্পিউটারে @ এসএএন জিসিসি 9.3 সিস্টেমের শিরোনামে ম্যাক্রোগুলির কোনও সহায়তা ছাড়াই নিজেই এই রূপান্তরটি করে। extern void bzero(void *, size_t); void clear(void *p, size_t n) { bzero(p, n); }একটি কল উত্পাদন করে memset। (অন্তর্ভুক্ত করুন stddef.hজন্য size_tঅন্য কিছু হস্তক্ষেপ করতে পারে না।)
zwol

4

আপনার সম্ভবত ব্যবহার করা উচিত নয়bzero , এটি আসলে স্ট্যান্ডার্ড সি নয়, এটি পসিক্স জিনিস ছিল।

আর শব্দ "ছিল" দয়া করে মনে রাখবেন - এটা ছিল অবচিত POSIX.1-2001 এবং মুছে সশ্রদ্ধ বাধ্যতা মধ্যে POSIX.1-2008 মধ্যে memset তাই আপনি ভাল প্রমিত C ফাংশন ব্যবহার করে বন্ধ করছি।


স্ট্যান্ডার্ড সি বলতে কী বোঝ? আপনার মানে এটি স্ট্যান্ডার্ড সি লাইব্রেরিতে পাওয়া যায় না?
Koray Tugay

@ কোরে, স্ট্যান্ডার্ড সি এর অর্থ আইএসও স্ট্যান্ডার্ড এবং হ্যাঁ, এটির bzeroঅংশ নয়।
paxdiablo

না আমি বলতে চাইছি না, আপনি কোনও মানক দ্বারা কী বোঝাতে চেয়েছেন তা আমি জানি না। আইএসও স্ট্যান্ডার্ড মানে স্ট্যান্ডার্ড সি লাইব্রেরি? যে ভাষা নিয়ে আসে? যে ন্যূনতম গ্রন্থাগারটি আমরা জানি এটি সেখানে থাকবে?
কোরে তুগায়

2
@ কোরে, আইএসও হ'ল স্ট্যান্ডার্ড সংস্থা যা সি স্ট্যান্ডার্ড, বর্তমান এক সি 11 এবং এর আগের সি 99 এবং সি 98 এর জন্য দায়বদ্ধ is সি হিসাবে বিবেচনা করার জন্য কোনও প্রয়োগটি অবশ্যই অনুসরণ করা উচিত সেগুলি তারা নীচে রেখেছেন yes সুতরাং হ্যাঁ, যদি মানটি বলে যে কোনও প্রয়োগ অবশ্যই মেমসেট সরবরাহ করতে পারে তবে এটি আপনার জন্য থাকবে। অন্যথায়, এটি সি নয়
paxdiablo

2

Memset ফাংশন জন্য, দ্বিতীয় যুক্তি একটি হল intএবং তৃতীয় যুক্তি size_t,

void *memset(void *s, int c, size_t n);

যা সাধারণত একটি unsigned int , তবে যদি 0 and 16দ্বিতীয় এবং তৃতীয় আর্গুমেন্টের জন্য যথাক্রমে মানগুলি যথাযথভাবে 16 এবং 0 হিসাবে ভুল ক্রমে প্রবেশ করানো হয় তবে মেমসেটে এ জাতীয় কলটি এখনও কাজ করতে পারে তবে কিছুই করবে না। কারণ আরম্ভ করার জন্য বাইটের সংখ্যা হিসাবে নির্দিষ্ট করা আছে 0

void bzero(void *s, size_t n)

এই ধরনের ত্রুটি বেজারো ব্যবহার করে এড়ানো যেতে পারে, কারণ ফাংশন প্রোটোটাইপগুলি ব্যবহার করা হলে বেজারোতে দুটি আর্গুমেন্ট অদলবদল করে সর্বদা সি কম্পাইলার দ্বারা ধরা পড়বে।


1
আপনি যদি কলটিকে "এই আকারের জন্য এই মেমরিটিকে এই মান হিসাবে সেট করুন" বলে মনে করেন বা আপনার যদি এমন কোনও আইডিই থাকে যা আপনাকে প্রোটোটাইপ দেয় বা এমনকি আপনি জানেন তবে আপনি কী জানেন এই জাতীয় ত্রুটি স্মৃতিতে এড়ানোও যায় করছেন :-)
প্যাক্সিডিয়াবলো

সম্মত হন, তবে এই ফাংশনটি এমন সময়ে তৈরি করা হয়েছিল যখন এই জাতীয় বুদ্ধিমান আইডিই সমর্থনগুলির জন্য উপলব্ধ ছিল না।
অবকাশ

2

সংক্ষেপে: memset এরপরে আরও সমাবেশের প্রয়োজন assemblybzero

এটি উত্স: http://fdiv.net/2009/01/14/memset-vs-bzero- মাল্টিমেট-শোডাউন


হ্যাঁ, এটি ওপিতে আমি উল্লেখ করেছি। আমি আসলে এমনকি সঠিক পৃষ্ঠাটির সাথে লিঙ্ক করেছি। দেখা যাচ্ছে যে কিছু সংকলক অপ্টিমাইজেশনের কারণে সত্যিই খুব বেশি পার্থক্য রয়েছে বলে মনে হচ্ছে না। আরও তথ্যের জন্য ওউয়ার গৃহীত উত্তরটি দেখুন।
সিউডোপাইচে

6
এটি কেবল দেখায় যে মেমসেটের একটি জঞ্জাল বাস্তবায়ন ধীর is ম্যাকোস এক্স এবং অন্য কয়েকটি সিস্টেমে মেমসেট কোড ব্যবহার করে যা বুট সময়ে আপনি যে প্রসেসরটি ব্যবহার করছেন তার উপর নির্ভর করে ভেক্টর রেজিস্টারগুলির পুরো ব্যবহার করে এবং বড় আকারের জন্য এটি শেষ বিটটি পেতে চতুর উপায়ে প্রিফেচ নির্দেশাবলী ব্যবহার করে গতি
gnasher729

কম নির্দেশাবলীর অর্থ দ্রুত কার্যকরকরণ নয়। লুপ আন্রোলিং, ফাংশন ইনলাইনিং, লুপ সারিবদ্ধকরণের কারণে অপ্টিমাইজেশানগুলি প্রায়শই বাইনারি আকার এবং নির্দেশাবলীর সংখ্যা বাড়িয়ে দেয় ... কোনও শালীন অপ্টিমাইজড কোড দেখুন এবং আপনি দেখতে পাবেন এটি প্রায়শই
ছিটে

2

আপনার পছন্দ মতো কোনও উপায়ে রাখুন। :-)

#ifndef bzero
#define bzero(d,n) memset((d),0,(n))
#endif

মনে রাখবেন যে:

  1. আসলটি bzeroকিছুই দেয় না, memsetশূন্য পয়েন্টার দেয় (d ) দেয়। সংজ্ঞাটিতে শূন্যের সাথে টাইপকাস্ট যুক্ত করে এটি ঠিক করা যেতে পারে।
  2. #ifndef bzeroমূল ফাংশনটি উপস্থিত থাকলেও তা আপনাকে আড়াল করতে বাধা দেয় না। এটি ম্যাক্রোর অস্তিত্ব পরীক্ষা করে। এটি প্রচুর বিভ্রান্তির কারণ হতে পারে।
  3. ম্যাক্রোতে ফাংশন পয়েন্টার তৈরি করা অসম্ভব। bzeroফাংশন পয়েন্টারগুলির মাধ্যমে ব্যবহার করার সময় , এটি কাজ করবে না।

1
এই সমস্যাটি কী, @ লিয়ার? ম্যাক্রোগুলির জন্য সাধারণ প্রতিষেধক? অথবা আপনি এই বিষয়টি পছন্দ করেন না যে এই ম্যাক্রোটি ফাংশনটির সাথে বিভ্রান্ত হতে পারে (এবং সম্ভবত এটি এটি আড়ালও করে)?
প্যালেক

1
@ প্যালেক, পরেরটি। একটি ম্যাক্রো হিসাবে একটি নতুন সংজ্ঞা লুকানো এত বিভ্রান্তির কারণ হতে পারে। এই কোডটি ব্যবহার করে অন্য একজন প্রোগ্রামার ভাবেন যে তিনি একটি জিনিস ব্যবহার করছেন এবং অজান্তেই অন্যটি ব্যবহার করতে বাধ্য হন। এটি একটি টাইম বোমা।
লিওর

1
এটিকে অন্য চিন্তাভাবনা দেওয়ার পরে, আমি সম্মত হই যে এটি সত্যই একটি খারাপ সমাধান। অন্যান্য বিষয়ের মধ্যে আমি একটি প্রযুক্তিগত কারণ পেয়েছি: bzeroফাংশন পয়েন্টারগুলির মাধ্যমে ব্যবহার করার সময় , এটি কাজ করবে না।
প্যালেক

আপনার ম্যাক্রোটিকে অন্য কিছু বলা উচিত ছিল bzero। এটি একটি নৃশংসতা।
ড্যান বেচার্ড

-2

মেমসেটটি 3 টি প্যারামিটার নেয়, বেজারো 2 টি মেমরির ক্ষেত্রে সীমিত করে দেয় যে অতিরিক্ত প্যারামিটারে আরও 4 বাইট লাগবে এবং বেশিরভাগ সময় এটি 0 এ সেট করতে ব্যবহৃত হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.