C/C++ 全局定义应该放在 .bss 还是 .data
C/C++ 中全局定义/声明的区别
无论在 C 还是 C++,想要仅声明而不在翻译单元中定义全局变量,都需要 extern。
C语言:(强弱是方便我叙述引出的概念)
int global = 1; // 强定义,和其他强定义互斥
int global; // 弱定义,可以和同文件其他定义兼容(最终只保留一份定义)
int global;
能编译!但是上面的代码和其他目标文件一起链接时,若出现多次定义同样会引发重复定义的错误。
C++:(单个文件)
int global; // 强定义
int global;
**<source>:2:5: error:** redefinition of '**int global**'
2 | int **global**;
| **^~~~~~**
**<source>:1:5: note:** '**int global**' previously declared here
1 | int **global**;
| **^~~~~~**
Compiler returned: 1
.bss 和 .data
.bss 原本放的是有声明但是无显式定义的变量。只记录变量的名字和长度,不占用其他空间。一般这些变量会被初始化为 0(ISO C 也是这么要求)。但实际上gcc倾向于把显式赋值为全零的变量也放在.bss,有非零初始值的则放在 .data 区。(可以节约空间)
现在两者区别几乎只有表示方式上。在全零的时候 .bss 能够节省空间。