我们有一个巨大的二进制文件,并且在名称空间中定义了常量,例如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'部?
答案 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
中。