2017-04-07 5 views
0

여러 번역 단위에서 다음 인라인 함수를 호출 할 때 정확히 "후드"가 발생하는 것에 관심이 있습니다.인라인 함수의 정적 변수

namespace some_name 
{ 
    inline const float& get_float() 
    { 
     static const float a = 5.0f; 
     return a; 
    } 
} 

내 의도는 외부로 링크 된 변수를 만드는 것이었다 'A'(네임 스페이스와 헤더가 포함되어있는 경우)하는 코드를 사용하지만, 또한 내가이 변수에 대한 변경을 방지하고 싶었 될 수있다. 테스트에서 나는 성공한 것으로 보이지만이 함수를 처음으로 호출하고 다음에 여러 번 호출하면 정확히 무슨 일이 일어나는지에 관심이 있습니다.

추가 질문 : 정적 변수 선언/정의로 전역 네임 스페이스를 오염시키고 있습니까?

+1

static const float를 반환하는 함수를 만드는 대신 클래스의 멤버 변수 또는 네임 스페이스의 멤버 변수로만 설정하는 것이 좋습니다. 그것은 여전히 ​​const입니다 ... – UKMonkey

+0

UKMonkey 내가 그런 식으로한다면, 내가 다른 변수 변환 단위로 변수를 사용할 때마다 const float 유형의 복사본을 얻을 것이라고 확신하지 못했습니다. – user3271640

+1

'a'가 외부 적으로 연결되어 있는지 확인 하시겠습니까? 왜 외부 연결 상수가 필요합니까? 외부 연결은 여러 컴파일 단위가 하나의 변수 인스턴스를 공유하고 변경 될 때 모든 단위가 업데이트 된 값을 읽는 것을 나타냅니다. 그러나 상수는 변하지 않을 것으로 예상됩니다. 더욱이 많은 경우 컴파일러는 상수 값을 직접 명령어에 포함시켜 메모리에 나타나지 않습니다. –

답변

0

하지만이 함수를 처음으로 호출 한 다음 정확히 다음 번에 여러 번 호출하면 어떤 일이 발생하는지에 관심이 있습니다.

초기화는 정적입니다 (런타임에는 아무런 영향을받지 않습니다). 따라서 프로그램 시작시 초기화가 수행됩니다. 모든 호출은 단순히 정적 객체에 대한 참조를 반환합니다. 그리고 이러한 호출은 아마도 인라인으로 확장되어 정적 객체를 직접 사용하십시오.

더 간단한 옵션은 네임 스페이스에서 전역 변수를 사용하는 것입니다.

추가 질문 : 정적 변수 선언/정의로 전역 네임 스페이스를 오염시키고 있습니까?

아니요. 정적 변수는 로컬이므로 아무런 네임 스페이스도 오염시키지 않습니다. 함수 자체는 선언 된 네임 스페이스를 "오염"시킵니다.

+0

네임 스페이스의'static' 변수는 반대를합니다. 즉, 헤더를 포함하는 TU 당 하나의 변수를 정의합니다. – Quentin

+0

@Quentin 예, 전역 변수 (정적 저장소가있는 비 로컬 변수)를 의미했습니다. 하지만 다른 컴파일 단위의 복제본이 어쨌든 부숴지기 때문에 상수는 중요하지 않습니다. – user2079303

+0

@Quentin 이것이 내가 궁금해하는 것입니다. 그래서 네임 스페이스에 변수를 정의하지 않았습니다. 이 머리글을 포함하는 모든 TU에서 특정 정적 개체를 직접 사용하고 싶습니다. – user3271640