Linux C ++二进制命名空间

时间:2011-12-12 19:09:52

标签: c++

我们有一个巨大的二进制文件,并且在名称空间中定义了常量,例如header1.h:

namespace One
{
    namespace Two
    {

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

问题在于,当我们使用instrumentation(-finstrument-functions和_cyg * functions)运行二进制文件时,我们在报告中看到如下方法 - 它们是否未在数据段中声明:

__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)为什么_ tcf 被定义为' t'部?

1 个答案:

答案 0 :(得分:2)

你肯定在搞乱编译器以及他/他在什么时候工作。

如果您将某些内容定义为const String TEST = "something";,那么您实际上创建了一个String对象(无论是什么字符串),除非String只是char *的定义。因此,在运行程序之前,运行每个对象的构造函数(这不是,并且不能在编译时完成,因此必须在运行时完成)。

我不知道你是如何使用这些常量的,但是如果它们以后才与const char*一起使用,那么你应该能够通过简单地提高性能列出那些:

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

如果您再次尝试将这些作为某种String对象使用,则可能会在以后产生额外的开销。它本质上是在启动时完成的工作" vs."使用它们时要完成的工作"。 const不会说没有涉及的工作(与const文字或const积分值一样)。

关于问题的第二部分,你必须等待其他人解释这一点,因为我并不熟悉它。虽然您在.data部分中看不到此代码,因为它在运行时动态分配(以及要运行的代码)。使用的字符串文字应该在.data中。