g ++创建const的几个符号?

时间:2010-04-22 22:04:34

标签: c++ gcc

在我的一个标题(C ++)文件中,我改变了

   #define TIMEOUT 10

更多(?)C ++方式:

const int TIMEOUT = 10;

然而,似乎g ++(v 4.4.3)现在在二进制文件中多次包含此符号。

$ nm -C build/ipd/ipd |head
08050420 T ToUnixTime
08050470 T ParseTime
080504c0 T ParseISOTime
080518e4 r TIMEOUT
080518ec r TIMEOUT
080518f4 r TIMEOUT
080518fc r TIMEOUT
080503e0 T HandleMessage

怎么回事?

3 个答案:

答案 0 :(得分:6)

您可能已将标题包含在四个单独的翻译单元(.cpp文件)中。

未声明为extern的命名空间范围const变量隐含static,因此每个包含标题的翻译单元都有一个。

答案 1 :(得分:3)

尝试使用enum。这很像#define,你不能参考它,并且保证不会在任何地方占用任何空间。

enum { TIMEOUT = 10 };

但如果它没有给你带来任何麻烦,我不会以某种方式担心。 const int方式很好,我们谈论的是16个字节,给予或接受。

答案 2 :(得分:0)

编译器可能已经发现复制符号比引用符号更有效。这是由const修饰符引起的。

在许多情况下,加载具有“立即”值的寄存器(存储在可执行文件中的值)比从使用间接寻址的ROM(只读存储器)中的位置加载更有效。

我不担心许多目标文件中的常量整数重复,除非它使文件太大而无法放在硬盘上。此外,目标文件是数据的临时存储,直到生成可执行文件。

我建议更多地关注应用程序的质量和健壮性,而不是目标文件的内部。