2011-12-12 60 views
0

我們有一個巨大的二進制文件,並且在命名前定義的常量說那麼header1.h:Linux的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 

當然我們可以說,在執行過程中的命名空間常數由編譯器構成。我怎樣才能減少它們的執行開銷和ii)爲什麼將定義爲't'部分?

+0

您應該使用'nm -C a.out'來對C++符號名稱進行解映射。 –

回答

2

你肯定會搞亂編譯器,以及他在什麼時候工作。

如果你定義的東西作爲const String TEST = "something";你基本上創建String對象(無論字符串,它是),除非String只是一個定義char *。因此,在程序運行之前,運行這些對象的構造函數(這不是也不能在編譯時完成,因此它必須在運行時發生)。

我不知道你是如何使用這些常量,但如果他們與const char*只是後來在使用時,你應該能夠提高性能提升不少,只列出那些:

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

但是,如果您試圖再次將這些對象用作某種String對象,則可能會在以後創建額外開銷。它基本上是「在啓動時完成的工作」與「在使用它們時要完成的工作」。常量不會說沒有涉及的工作(與常量字面量或常量整型值一樣)。

至於問題的第二部分,您必須等待其他人解釋這一點,因爲我不熟悉它。儘管在運行時動態分配(以及要運行的代碼),但您不會在.data部分看到此代碼。雖然使用的字符串文字應該在.data之內。

+0

另外值得注意的是,當你在主體之前構造一個對象時,你將冒着拋出的異常終止你的程序,因爲沒有辦法捕捉它。 –