2011-12-12 2 views
0

우리는 거대한 바이너리 가지고있는 네임 스페이스 예에 정의 된 상수 말을 가지고 header1.h :리눅스 C++ 바이너리 네임 스페이스

namespace One 
{ 
    namespace Two 
    { 

      const String TEST_DATE_TIME = "DDMMYYYY"; // Line number say 32 
      // ................ Around 2500 such constants .......... 
    } 
} 

문제는 그 우리는 장비 (-finstrument-기능과 _cyg와 바이너리를 실행할 때

__tcf_2275,header1.h: 32 

가 실행 중에 컴파일러는 네임 스페이스 상수를 만드는 시간을 보내는 것을 의미합니까 - 그런데 왜 : 그들은 데이터 세그먼트에 선언되지 않습니다 - * 우리는 우리의 보고서에서 다음과 같은 방법 참조) 기능? 네임 스페이스에서 상수를 선언하는 샘플 파일에서 동일한 동작을 보지 못합니다. 또한

-

nm a.out| grep __tcf_ | more 

000000000807acf8 t __tcf_1234 
000000000807ad60 t __tcf_1456 
............................ 
000000000816ddd0 t __tcf_1125 
............................ 

addr2line -Cfe a.out 0x807acf8 0x807ad60 

__tcf_2275 
header1.h:2322 
__tcf_2274 
header1.h:2321 

는 확실히 우리는 실행 중에 네임 스페이스 상수는 컴파일러에 의해 구성되어 있음을 명시 할 수 있습니다. 어떻게하면 i) 실행 오버 헤드를 줄이기 위해 그들을 줄일 수 있습니까? 그리고 ii) 't'섹션으로 정의 된 _ tcf은 왜 있습니까?

+0

C++ 심볼 이름을 디 앵글 링하려면'nm -C a.out'을 사용해야합니다. –

답변

2

당신은 분명히 컴파일러를 망칠 것입니다. 그리고 그는 언제 일하고 있습니까?

당신은 단지 char *에 대해 정의되어 String 않는 한 const String TEST = "something"; 당신은 본질적으로 String 객체 (무엇이든 문자열)를 만드는 등의 일을 정의합니다. 따라서 프로그램이 실행되기 전에 이러한 각 객체의 생성자가 실행됩니다 (컴파일 타임에 수행되지 않으며 수행 할 수 없으므로 런타임에 발생해야합니다).

난 당신이 이러한 상수를 사용하는 방법을 모른다, 그러나 만 나중에 const char*와 함께 사용하는 경우, 당신은 단순히 그 나열하여, 성능을 많이 향상시킬 수 있어야한다 :

namespace foo { 
    namespace bar { 
     const char *MY_CONSTANT = "hello world!"; 
    } 
} 

그러나 이것들을 어떤 종류의 String 객체로 다시 사용하려고하면 나중에 추가 오버 헤드가 발생할 수 있습니다. 근본적으로 "시작시 작업해야하는 작업"과 "작업을 수행 할 때 수행 할 작업"입니다. const는 (const 리터럴이나 const 적분 값처럼) 관련된 작업이 없다고 말하지 않을 것입니다.

질문의 두 번째 부분에 대해서는 다른 사람이 설명 할 때까지 기다려야 할 것입니다. 익숙하지 않기 때문에. .data 섹션에이 코드가 표시되지 않지만 런타임에 동적으로 할당되므로 코드가 실행됩니다. 사용 된 문자열 리터럴은 .data이어야합니다.

+0

또한 주목할 가치가있는 것은 주전에 객체를 생성 할 때 예외를 던질 위험이 있다는 것입니다. 예외를 잡을 방법이 없으므로 프로그램을 종료하게됩니다. –