c ++ const符号膨胀链接文件

pio*_*otr 2 c++ linker const constants

在C++中将const放在头文件中是合法的,通常C方式是将extern声明放在头部和定义中只在一个编译单元中,但在C++中,前一种技术导致二进制增加,因为链接时不删除符号(使用gnu ld和visual studio进行测试).有没有办法做这些事情?我只能想到一个定义或C方式,但后者可能会为更少的优化提供空间......


piotr@gominola:0:/tmp$ g++ -c b.cc
piotr@gominola:0:/tmp$ g++ -c a.cc
piotr@gominola:0:/tmp$ nm a.o | c++filt | grep COOK
0000000000000000 r AI_LIKE_COOKIES
piotr@gominola:0:/tmp$ nm b.o | c++filt | grep COOK
0000000000000000 r AI_LIKE_COOKIES
piotr@gominola:0:/tmp$ g++ -o a a.o b.o
piotr@gominola:0:/tmp$ nm a | c++filt | grep COOK
0000000000400610 r AI_LIKE_COOKIES
0000000000400618 r AI_LIKE_COOKIES



piotr@gominola:0:/tmp$ cat a.h
#ifndef a_h
#define a_h

//const double A = 2.0;
//extern const double AI_LIKE_COOKIES;
const double AI_LIKE_COOKIES = 5.0;

#endif
piotr@gominola:0:/tmp$ cat a.cc
#include "a.h"
using namespace std;

extern void f();

//const double AI_LIKE_COOKIES = 2.0;

int main(int argc, char *argv[])
{
    f();
}
piotr@gominola:0:/tmp$ cat b.cc
#include "a.h"

void f()
{
}
piotr@gominola:0:/tmp$
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 6

声明const且未显式声明的对象extern在C++中具有内部链接.这意味着每个翻译单元都会获得它自己的对象副本.

但是,由于它们具有内部链接,因此无法从其他转换单元命名,编译器可以检测对象本身是否未被使用 - 对于基本const对象,这仅仅意味着它的地址是否从未被占用; 它的值可以根据需要替换 - 并从目标文件中省略它.

即使在,gcc也会执行此优化-O1.

$ g++ -O1 -c a.cc
$ g++ -O1 -c b.cc
$ g++ -o a a.o b.o 
$ nm a.o | c++filt | grep COOK
$ nm b.o | c++filt | grep COOK
$ nm a | c++filt | grep COOK
$ 
Run Code Online (Sandbox Code Playgroud)