文章目录
extern二进制文件与内存静态内存静态变量分配空间未初始化的变量,什么时候初始化。C语言不支持静态变量的动态初始化,C++ 支持staticconst参考extern
对于全局变量,可以使用extern 在其他文件中使用全局变量。推荐的用法
1、在 .c 文件中定义一个全局变量,例如,char array[1010241024];
2、在 .h 文件中使用 extern char array;
3、其他文件使用时,直接 #include xxx.h ,然后使用extern char array;
这个是比较推荐的用法
最不推荐:在xxx.h 中定义全部变量,头文件被引用后,容易造成重复定义。
另外,头文件之间最好松耦合,函数单独定义,one in,one out。不要交叉引用,造成逻辑不清晰,增加错误可能性。
另外 全局变量定义后,初始化了,gcc main.cpp -o main编译后,全局变量将会保存在二进制程序文件.Data 段中。
二进制文件与内存
二进制文件有两个重要的段section:代码段与数据段
数据分为段:.Data 和 .bss段,
.Bss段存放未初始化的全局变量和局部静态变量,初始化为0的也在这个段,bss段不占用bin文件空间。.Data 段存放初始化的全局变量和初始化的局部静态变量
注意:普通局部变量保存在堆栈中
代码段:
.Rodata 存放字符常量.Text 段存放代码
常量分为普通常量(比如2,3.0,#define PI 3.14)和文字常量(比如“hello world”)。
普通常量经编译后成为二进制程序代码的一部分;
文字常量保存在文字常量区,这部分内存中的内容不允许修改。
静态内存
数据段 .Bss 和 .Data 为静态内存,不使用栈内存。
静态变量
存储在静态内存的变量,即使没有每static修饰。
注意:static 在不同位置有不同含义,待会讲。
静态内存在程序运行前被创建,分为:已经初始化和未初始化
初始化的:static 的局部变量;初始化的全局变量;static局部变量默认就是zero-init,即使没有显式的初始化,也会是zero;全局变量赋值了就算是初始化,会在编译阶段初始化放在静态内存的.data段。
未初始化的:未初始化的全局变量和局部静态变量,初始化为0的也在这个段。存放在.bss段,.bss不占用bin文件空间。
.data 在编译阶段已经完成了创建+初始化;.bss 在编译阶段完成了创建,为初始化,初始化的时间未知,空有其名。
分配空间
程序运行前,.data 直接被加载到映射到内存中,非栈空间。(在运行后,全局变量被调用了,才会被linux监控器计算?这一点我还不清楚)
.bss 在二进制的section header table定义了,但是只有在程序运行后。(到底什么时候分配内存,我理解这和操作系统不同也会不同,linux可能是在调用的时候才会想着取给他分配空间)。
未初始化的变量,什么时候初始化。
进程载入时初始化。
C语言不支持静态变量的动态初始化,C++ 支持
C语言中静态变量,创建在编译的时候完成,初始后都是在程序运行前完成的。
static
1、对全局变量使用static修饰,该变量只能在本文件内使用。
2、staic 对局部变量修饰,该变量认为时静态内存里面的变量
const
在c语言中
1、const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。static const 变量 属于静态内存,在.data段,占用bin文件空间。
2、可以通过指针对const局部变量进行修改
3、不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段
4、c中const默认为外部连接
C++中,
c中const默认为外部连接,c++中const默认为内部连接.当c语言两个文件中都有const int a的时候,编译器会报重定义的错误。而在c++中,则不会,因为c++中的const默认是内部连接的。如果想让c++中的const具有外部连接,必须显示声明为: extern const int a = 10。
参考
/view/496c452601020740be1e650e52ea551810a6c924.html