[c++] 이름없는 네임 스페이스가 사용되는 이유와 그 이점은 무엇입니까?



Answers

익명 네임 스페이스에 무언가가 있다는 것은이 번역 단위 (.cpp 파일 및 모든 포함)에 대해 로컬임을 의미합니다. 즉, 동일한 이름을 가진 다른 심볼이 다른 곳에 정의되면 ODR ( One Definition Rule) 위반이 발생하지 않습니다.

이것은 정적 전역 변수 또는 정적 함수를 갖는 C 방식과 동일하지만 클래스 정의에도 사용할 수 있습니다 (C ++에서는 static 이 아니라 사용해야합니다).

같은 파일에있는 모든 익명의 네임 스페이스는 동일한 네임 스페이스로 취급되며 서로 다른 파일의 모든 익명의 네임 스페이스는 별개입니다. 익명 네임 스페이스는 다음과 같습니다.

namespace __unique_compiler_generated_identifer0x42 {
    ...
}
using namespace __unique_compiler_generated_identifer0x42;
Question

방금 C + + 소프트웨어 프로젝트에 합류하여 디자인을 이해하려고합니다. 이 프로젝트는 이름없는 네임 스페이스를 자주 사용합니다. 예를 들어, 다음과 같은 내용이 클래스 정의 파일에서 발생할 수 있습니다.

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

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

이름없는 네임 스페이스를 사용하게하는 디자인 고려 사항은 무엇입니까? 장점과 단점은 무엇입니까?




이 질문에 대한 다른 대답 외에도 익명의 네임 스페이스를 사용하면 성능을 향상시킬 수 있습니다. 네임 스페이스 내의 심볼은 외부 링키지가 필요 없기 때문에 컴파일러는 네임 스페이스 내에서 코드를 적극적으로 최적화 할 수 있습니다. 예를 들어 루프에서 한 번 여러 번 호출되는 함수는 코드 크기에 영향을 미치지 않고 인라인 될 수 있습니다.

예를 들어, 익명의 네임 스페이스 (x86-64 gcc-4.6.3 및 -O2)를 사용하는 경우 내 시스템에서 다음 코드는 런타임의 약 70 %를 차지하지만 add_val의 추가 코드는 컴파일러가 두 번).

#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;
}



이름없는 네임 스페이스는 클래스, 변수, 함수 및 객체가 정의 된 파일에 대한 액세스를 제한합니다. 이름 공간 기능은 C / C ++의 static 키워드와 유사합니다.
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



Links