কেন নামবিহীন নেমস্পেস ব্যবহার করা হয় এবং এর সুবিধা কী?


242

আমি সবেমাত্র একটি নতুন সি ++ সফ্টওয়্যার প্রকল্পে যোগদান করেছি এবং আমি নকশাটি বোঝার চেষ্টা করছি। প্রকল্পটি নামবিহীন নেমস্পেসগুলির ঘন ঘন ব্যবহার করে। উদাহরণস্বরূপ, শ্রেণি সংজ্ঞা ফাইলে এরকম কিছু ঘটতে পারে:

// newusertype.cc
namespace {
  const int SIZE_OF_ARRAY_X;
  const int SIZE_OF_ARRAY_Y;
  bool getState(userType*,otherUserType*);
}

newusertype::newusertype(...) {...

ডিজাইনের বিবেচনাগুলি কী কী যার কারণে কোনও একটি নামবিহীন নেমস্পেস ব্যবহার করতে পারে? সুবিধা এবং অসুবিধা সমূহ কি কি?

উত্তর:


189

শনাক্তকরণের নামকরণ স্থানগুলি শনাক্তকারী অনুবাদ ইউনিটকে স্থানীয় করার একটি ইউটিলিটি। তারা এমন আচরণ করে যেন আপনি কোনও নেমস্পেসের জন্য অনুবাদ ইউনিট প্রতি অনন্য নামটি বেছে নেবেন:

namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }

খালি দেহটি ব্যবহার করে অতিরিক্ত পদক্ষেপ গুরুত্বপূর্ণ, তাই আপনি ইতিমধ্যে নামস্পেসের বডির মধ্যে সনাক্তকারীদের কাছে ::nameসেই নামস্থানে সংজ্ঞায়িত হিসাবে চিহ্নিত করতে পারেন , যেহেতু ব্যবহারের নির্দেশ ইতিমধ্যে কার্যকর হয়েছিল।

এর অর্থ আপনার একচেটিয়া ফাংশন থাকতে পারে (উদাহরণস্বরূপ) helpযা একাধিক অনুবাদ ইউনিটে বিদ্যমান থাকতে পারে এবং লিঙ্কের সময় এগুলি সংঘর্ষে আসবে না। প্রভাবটি staticসিতে ব্যবহৃত কীওয়ার্ডটি ব্যবহার করার মতো যা আপনি শনাক্তকারীদের ঘোষণায় রাখতে পারেন তা প্রায় একইরকম । নামবিহীন নেমস্পেসগুলি একটি উচ্চতর বিকল্প, এমনকি কোনও টাইপ অনুবাদ ইউনিটকে স্থানীয় করে তুলতে সক্ষম।

namespace { int a1; }
static int a2;

উভয়েরই aঅনুবাদ ইউনিট স্থানীয় এবং লিঙ্ক সময়ে সংঘর্ষ হবে না। তবে পার্থক্যটি হ'ল a1অজ্ঞাতনামে স্থানের একটি অনন্য নাম পান।

কৌতুক-কম্পিউটিংয়ে দুর্দান্ত নিবন্ধটি পড়ুন কেন স্থির পরিবর্তে একটি নামবিহীন নেমস্পেস ব্যবহার করা হয়? ( সংরক্ষণাগার ..org আয়না )।


আপনি সম্পর্ক সম্পর্কে ব্যাখ্যা static। আপনি কি দয়া করে তুলনা করতে পারেন __attribute__ ((visibility ("hidden")))?
ফিনজ

74

বেনামে নেমস্পেসে কিছু থাকার অর্থ এটি এই অনুবাদ ইউনিটের স্থানীয় (.cpp ফাইল এবং এর সবগুলি অন্তর্ভুক্ত) এর অর্থ এই যে একই নামের অন্য চিহ্নটি অন্য কোথাও সংজ্ঞায়িত করা হলে ওয়ান সংজ্ঞা রুল (ওডিআর) লঙ্ঘন হবে না ।

এটি স্ট্যাটিক গ্লোবাল ভেরিয়েবল বা স্ট্যাটিক ফাংশন থাকার সি উপায়ের মতো তবে এটি শ্রেণির সংজ্ঞাগুলির জন্যও ব্যবহার করা যেতে পারে (এবং staticএটি সি ++ এর পরিবর্তে ব্যবহার করা উচিত )।

একই ফাইলের সমস্ত বেনাম নেমস্পেসগুলি একই নেমস্পেস হিসাবে গণ্য করা হয় এবং বিভিন্ন ফাইলের সমস্ত বেনামে নামগুলি পৃথক। একটি বেনামে নামস্থান সমতুল্য:

namespace __unique_compiler_generated_identifer0x42 {
    ...
}
using namespace __unique_compiler_generated_identifer0x42;

14

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

static int x;  // Correct 

কিন্তু,

static class xyz {/*Body of class*/} //Wrong
static structure {/*Body of structure*/} //Wrong

তবে নামবিহীন নেমস্পেসের মাধ্যমে একই হওয়া সম্ভব। উদাহরণ স্বরূপ,

 namespace {
           class xyz {/*Body of class*/}
           static structure {/*Body of structure*/}
  } //Correct

13

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

উদাহরণস্বরূপ, আমার সিস্টেমে নিম্নলিখিত কোডটি চালানোর সময়টির প্রায় 70% সময় নেয় যদি বেনামে নামস্থান ব্যবহার করা হয় (x86-64 gcc-4.6.3 এবং -O2; নোট করুন যে অ্যাড_ওয়ালে অতিরিক্ত কোড সংকলকটি অন্তর্ভুক্ত করতে চায় না এটি দ্বিগুণ)।

#include <iostream>

namespace {
  double a;
  void b(double x)
  {
    a -= x;
  }
  void add_val(double x)
  {
    a += x;
    if(x==0.01) b(0);
    if(x==0.02) b(0.6);
    if(x==0.03) b(-0.1);
    if(x==0.04) b(0.4);
  }
}

int main()
{
  a = 0;
  for(int i=0; i<1000000000; ++i)
    {
      add_val(i*1e-10);
    }
  std::cout << a << '\n';
  return 0;
}

5
সত্য হতে পারে খুব ভাল - আমি নাম স্পেস বিবৃতি সহ ও-ছাড়া O3 অপ্টিমাইজেশন ব্যবহার করে জিসিসি 4-1-2-তে এই বিভাগটি ব্যবহার করেছিলাম: -> একই সময় (3 সেকেন্ড, -O3 সহ, এবং -33 সহ 4 সেক) পেয়েছি
থিও

2
এই কোডটি ইচ্ছাকৃতভাবে জটিল এবং জটিল সংযোজনকারীকে ইনলাইন বি এবং অ্যাড_ওয়ালকে মূলত অন্তর্ভুক্ত না করার চেষ্টা করল try কোড ফোলাতে ব্যয় নির্বিশেষে O3 অপ্টিমাইজেশান প্রচুর ইনলাইনিং ব্যবহার করে। এখনও রয়েছে, সম্ভবত ফাংশনগুলি যেখানে O3 অ্যাড_ওয়ালটিকে ইনলাইন করবে না। আপনি অ্যাড_ওয়ালাকে আরও জটিল করার চেষ্টা করতে পারেন, বা বিভিন্ন পরিস্থিতিতে এটিকে একাধিকবার কল করতে পারেন।
xioxox

5
@ ড্যানিয়েল: আমি কী মিস করছি? যেমনটি পড়েছেন, আপনি বলেছিলেন যে আপনি নিজের তুলনা -O3করেছেন, তারপরে আপনি বলেছিলেন 3 বনাম 4 সেকেন্ড "একই সময়"। এগুলির কোনোটাই কিছুটা বোধগম্য নয়। আমি সন্দেহ করি আসল ব্যাখ্যাটি হবে তবে এটি কী?
আন্ডারস্কোর_ড

@ আসরস্কোর_ডি উত্তরটি জানিয়েছে -O2 -O3 নয় উভয় ক্ষেত্রেই ব্যবহৃত হয়েছিল। বিভিন্ন অপ্টিমাইজেশনের স্তরগুলি আলাদাভাবে আচরণ করতে পারে। এছাড়াও, বিভিন্ন সংকলক সংস্করণগুলি আলাদাভাবে আচরণ করতে পারে (উত্তরটি পুরানো হয়ে যেতে পারে, এটি হ'ল)
পল স্টেলিয়ান

1
@ পলস্টেলিয়ান আমি এটি জানি, তবে এটি বেশ পরিষ্কার বলে মনে হয়েছে যে আমি জাইওক্সক্সের জবাব না দিয়ে থিওর মন্তব্যে (তবে তার নাম বদল হয়েছে বা আমি কোনওভাবে মিশে গিয়েছি) জবাব দিচ্ছিলাম
আন্ডারস্কোর_আদ

12

উদাহরণটি দেখায় যে আপনি যে প্রকল্পে যোগদান করেছেন তার লোকেরা বেনামে নাম স্থান বুঝতে পারে না :)

namespace {
    const int SIZE_OF_ARRAY_X;
    const int SIZE_OF_ARRAY_Y;

এগুলিকে একটি অনামী নেমস্পেসে রাখার দরকার নেই, কারণ constবস্তুর ইতিমধ্যে স্থির যোগসূত্র রয়েছে এবং তাই সম্ভবত অন্য অনুবাদ ইউনিটে একই নামের শনাক্তকারীদের সাথে দ্বন্দ্ব করতে পারে না।

    bool getState(userType*,otherUserType*);
}

এবং এটি আসলে একটি হতাশা: getState()বাহ্যিক সংযোগ আছে। স্থির যোগসূত্রটি পছন্দ করা ভাল, কারণ এটি প্রতীক টেবিলটিকে দূষিত করে না। এটি লিখতে ভাল

static bool getState(/*...*/);

এখানে. আমি একই ফাঁদে পড়েছি (স্ট্যান্ডার্ডে শব্দটি লেখা আছে যে ফাইল-স্ট্যাটিকসটি কোনওভাবে নামবিহীন নেমস্পেসের পক্ষে হ্রাস করা হয়েছে), তবে কে-ডি-ই-র মতো একটি বড় সি ++ প্রকল্পে কাজ করার ফলে আপনি প্রচুর লোককে পেয়েছেন যা আপনার মাথাকে সঠিক পথে ঘুরিয়েছে আবার প্রায় :)


10
যেহেতু সি ++ ১১ নামবিহীন নেমস্পেসগুলির অভ্যন্তরীণ লিঙ্কেজ রয়েছে (স্ট্যান্ডার্ডের 3.5.৩ বিভাগে বা en.cppreferences.com/w/cpp/language/namespace#Unname_namespaces )
এমিলি বৃজডাগস

11
প্রযুক্তিগতভাবে, নিশ্চিত - তবে তবুও, তাদের শব্দার্থবিজ্ঞানের ভিজ্যুয়াল অনুস্মারক হিসাবে এবং এটিকে (আরও আরও) ছোট করে constনেজ অপসারণ করার জন্য "এগুলি কোনও অনামী নেমস্পেসে থাকার দরকার নেই" hurt পরে যদি ইচ্ছা হয়। আমি সন্দেহ করি এর অর্থ ওপেনের দল "কিছুই বুঝতে পারে না"! এছাড়াও, বাহ্যিক সংযোগ থাকা বেনামে নামস্থানগুলিতে ফাংশন সম্পর্কে বিটটি সি ++ 11 এর পরে উল্লিখিত হিসাবে ভুল। আমার বোঝার দ্বারা, তারা টেমপ্লেট আর্গুমেন্টগুলির একটি সমস্যা আগে স্থির করেছিল যাতে বাহ্যিক সংযোগ প্রয়োজন, সুতরাং নামবিহীন নেমস্পেসগুলি (টেমপ্লেট আরোগুলি রাখতে সক্ষম) অভ্যন্তরীণ সংযোগ স্থাপনের অনুমতি দিতে পারে।
আন্ডারস্কোর_ড

11

একটি অনামী নেমস্পেস কেবল সেই ফাইলের অভ্যন্তরে বদ্ধ ভেরিয়েবল, ফাংশন, ক্লাস, ইত্যাদি উপলব্ধ করে। আপনার উদাহরণে এটি বৈশ্বিক চলক এড়ানোর একটি উপায়। রানটাইম বা সংকলন সময়ের পারফরম্যান্সের পার্থক্য নেই।

"আমি কি এই পরিবর্তনশীল, ফাংশন, শ্রেণি ইত্যাদি সরকারী বা বেসরকারী হতে চাই?" বাদ দিয়ে এত বেশি সুবিধা বা অসুবিধা নেই?


2
পারফরম্যান্সের পার্থক্য থাকতে পারে - আমার উত্তরটি এখানে দেখুন। এটি সংকলকটি কোডটিকে আরও উন্নত করতে দেয়।
xioxox

2
তোমার একটা কথা আছে; কমপক্ষে সি ++ যতটা আজ রয়েছে। তবে, টেমপ্লেট আর্গুমেন্ট হিসাবে ব্যবহার করার জন্য সি ++ 98 / সি ++ 03 প্রয়োজনীয় জিনিসের বাহ্যিক সংযোগ রয়েছে। যেহেতু বেনামে নেমস্পেসের জিনিসগুলি টেমপ্লেট আর্গুমেন্ট হিসাবে উপলব্ধ, তাই তাদের বাহ্যিক সংযোগ থাকবে (কমপক্ষে প্রাক-সি ++ 11 এ) যদি ফাইলের বাইরে থেকে তাদের উল্লেখ করার কোনও উপায় না থাকে। আমি মনে করি যে এতে কিছুটা বোঝার সামর্থ্য থাকতে পারে, কারণ স্ট্যান্ডার্ডটির জন্য কেবল জিনিসগুলি এমনভাবে কাজ করা প্রয়োজন যেগুলি বিধি প্রয়োগ করা হয়েছিল; এবং নিয়মিত প্রয়োগ না করে এটি করা কখনও কখনও সম্ভব।
ম্যাক্স ল্যাবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.