আমি কি "বাইটের সংখ্যা" শূন্যতে সেট করে মেমকিপি () এবং মেমমোভ () কে কল করতে পারি?


107

যখন আমার কাছে ধার্য কেসগুলির সাথে memmove()/ memcpy()হিসাবে অনুলিপি / অনুলিপি করার মতো কিছুই না থাকে তখন কি আমার ক্ষেত্রে চিকিত্সা করা দরকার?

int numberOfBytes = ...
if( numberOfBytes != 0 ) {
    memmove( dest, source, numberOfBytes );
}

অথবা আমি কেবল পরীক্ষা না করেই ফাংশনটি কল করব

int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

প্রাক্তন স্নিপেটে চেকটি কি প্রয়োজনীয়?


6
প্রশ্ন আমাকে ফ্রি মত ফাংশনগুলিতে নাল পয়েন্টারগুলির জন্য কিছুটা পরীক্ষা করার জন্য মনে করিয়ে দেয়। প্রয়োজনীয় নয়, তবে আপনাকে এটি সম্পর্কে চিন্তাভাবনা দেখানোর জন্য আমি সেখানে একটি মন্তব্য করব।
তুষারপাত

12
@ টোড: কোডটি বিশৃঙ্খলা ব্যতীত অন্য উদ্দেশ্যটি কী করে? কারও কোড পড়ার সময়, আমার জানার দরকার নেই যে মূল প্রোগ্রামার "এই অপারেশনটি করার বিষয়ে ভেবেছিলেন যা আসলে প্রয়োজনীয় নয়, তবে এটি অপ্রয়োজনীয় হওয়ার কারণে, আমি এটি করিনি"। যদি আমি কোনও পয়েন্টারকে মৌমাছি ছেড়ে দেওয়ার বিষয়টি দেখতে পাই, তবে আমি জানি এটি নালার অনুমতি দেওয়া হয়েছে, সুতরাং "" আমার উচিত নাল পরীক্ষা করা উচিত "বিষয়বস্তুতে মূল প্রোগ্রামারটির চিন্তাভাবনাগুলি জানা দরকার নেই। এবং memcpy
একইটি

9
@ জালফ: এটি স্ট্যাকওভারফ্লো সম্পর্কিত একটি প্রশ্ন, এটি মানুষকে সন্দেহজনক করে তোলে। সুতরাং একটি মন্তব্য যুক্ত করা আপনাকে সাহায্য নাও করতে পারে তবে কম জ্ঞানের কারও পক্ষে সহায়তা করতে পারে
টড

4
@ টোড হ্যাঁ, মন্তব্যগুলি স্পষ্টভাবে বলেছিল যে চেকটি যে সত্যিই প্রয়োজনীয় দেখাচ্ছে তা নীতিগতভাবে মূল্যবান কেন হতে পারে না। অন্যান্য মুদ্রা পাশ যে এই বিশেষ উদাহরণ একটি সাধারণ ক্ষেত্রে একটি প্রমিত লাইব্রেরি ফাংশন প্রতিটি প্রোগ্রামার শুধুমাত্র একবার উত্তর জানার জন্য দরকার জড়িত হয়; তারপরে তারা যে কোনও প্রোগ্রামে পড়তে পারে তা বুঝতে পারে যে এই চেকগুলির দরকার নেই n't জন্য যে কারণে, আমি মন্তব্য বাদ চাই। এই জাতীয় একাধিক কল সহ একটি কোডবেস হয় হয় প্রতিটি মন্তব্য মন্তব্য অনুলিপি এবং পেস্ট করা প্রয়োজন, বা ইচ্ছুকভাবে কেবল কিছু কল এ সেগুলি ব্যবহার করুন, উভয়ই কুৎসিত।
মার্ক

উত্তর:


147

C99 স্ট্যান্ডার্ড থেকে (7.21.1 / 2):

যেখানে আর্গুমেন্ট হিসাবে ঘোষিত size_t nএকটি ফাংশনের জন্য অ্যারের দৈর্ঘ্য নির্দিষ্ট করে, সেখানে nসেই ফাংশনে কল করার ক্ষেত্রে মান শূন্য থাকতে পারে। এই সাবক্লাউসের কোনও নির্দিষ্ট ক্রিয়াকলাপের বর্ণনায় স্পষ্টভাবে অন্যথায় বর্ণিত না হলে, এই জাতীয় কলটিতে পয়েন্টার যুক্তিগুলির এখনও বৈধ মান থাকতে হবে, যেমন 7.১.৪ বর্ণিত রয়েছে। যেমন একটি কল, একটি ফাংশন যা একটি চরিত্র চিহ্নিত করে কোন ঘটনা খুঁজে পায় না, একটি ফাংশন যা দুটি চরিত্রের অনুক্রমের সাথে তুলনা করে শূন্য ফিরে আসে, এবং এমন একটি ফাংশন যা অক্ষর অনুলিপি করে শূন্য অক্ষর অনুলিপি করে।

তাহলে উত্তর হল না; চেক প্রয়োজনীয় নয় (বা হ্যাঁ; আপনি শূন্য পাস করতে পারেন)।


4
যদি কোনও অ্যারের শেষ উপাদানটি অনুসরণ করে অবস্থানটির দিকে ইঙ্গিত করা হয় তবে কোনও ফাংশনটি এই জাতীয় ফাংশনের উদ্দেশ্যে "বৈধ" হিসাবে বিবেচিত হবে? এই জাতীয় পয়েন্টার বৈধভাবে ডিফেন্ডার করা যায় না, তবে কেউ নিরাপদে অন্য কিছু পয়েন্টার-ইশ কাজ করতে পারে যেমন এটিকে থেকে বিয়োগ করে।
সুপারক্যাট

4
@ সুপের্যাট: হ্যাঁ, একটি পয়েন্টার যা অ্যারের শেষের দিকে গত একটিকে নির্দেশ করে সেই অ্যারের মধ্যে অন্য পয়েন্টারগুলির সাথে পয়েন্টার পাটিগণিতের জন্য বৈধ হয় (বা এর শেষের একটি অতীত) সেই অ্যারেটির মধ্যে বৈধ, তবে তা অবচয়যোগ্য নয়।
মাইক সিমুর

@ মাইকসিমুর: উদ্ধৃতিটি কি বিপরীত উত্তরকে বোঝানো উচিত নয়: চেকটি প্রয়োজনীয় এবং আপনি নাল পয়েন্টার দিয়ে শূন্য পাস করতে পারবেন না?
neverhoodboy 16

7
@ নেভারহুডবয়: না, উক্তিটি পরিষ্কারভাবে বলেছে " nমান শূন্য থাকতে পারে"। আপনি সঠিক যে আপনি নাল পয়েন্টারগুলি পাস করতে পারবেন না, তবে প্রশ্নটি এটিই জিজ্ঞাসা করছে না।
মাইক সিমুর 16

4
@ মাইকসিমুর: আমার দোষ। আন্তরিকভাবে দুঃখিত. প্রশ্নটি পয়েন্টারটি নয় আকারের বিষয়ে।
neverhoodboy

5

@ আপনার দ্বারা যেমন বলা হয়েছে, মানটি নির্দিষ্ট করে যে মেমকি এবং মেমোভটিকে সমস্যা ছাড়াই এই কেসটি পরিচালনা করা উচিত; যেহেতু এগুলি সাধারণত কোনওভাবে প্রয়োগ করা হয়

void *memcpy(void *_dst, const void *_src, size_t len)
{
    unsigned char *dst = _dst;
    const unsigned char *src = _src;
    while(len-- > 0)
        *dst++ = *src++;
    return _dst;
}

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


4
আমি মনে করি এই ফাংশনটি সম্ভবত সমাবেশে তৈরি করা হয়েছে যেখানে আপনি গের চেয়ে মেমরি ট্রান্সফারগুলি আরও ভাল করতে পারেন
টড

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

9
-1, সাধারণ প্রয়োগটি শূন্য আর্গুমেন্ট সহ এই ক্রিয়াকলাপগুলি (যা এমনকি সি ফাংশন হিসাবে প্রয়োগ করা যেতে পারে না) কল করা বৈধ কিনা তা সম্পর্কিত অপ্রাসঙ্গিক।
আর .. গীটহাব বন্ধ করুন ICE

4
এটি বৈধ সি এর সত্যতা ইতিমধ্যে অন্যান্য জবাবগুলি দ্বারা আবৃত হয়েছে, যেমনটি আমি আমার উত্তরের প্রথম দিকে বলেছিলাম: "@ আপনি বলেছেন, মানকটি নির্দিষ্ট করে যে মেমকি এবং মেমোমোভকে সমস্যা ছাড়াই এই কেসটি পরিচালনা করা উচিত"। আমি ঠিক এই বিষয়ে আমার মতামত জুড়েছি যে পারফরম্যান্সের কারণে আপনার লেন = 0 দিয়ে মেমকিটি কল করার ভয়ও পাওয়া উচিত নয়, যেহেতু এটি প্রায় শূন্য দামের কল।
মাত্তেও ইতালি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.