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)
声明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)
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |