Type
为什么指针类型建议使用uintptr_t
而不是usigned long
?
uintptr_t
: 在 C99 标准中引入,用于表示指针大小,具有跨平台性,而usigned long
不确定,比如在 Windows 64位机器上为32个字节,而非64个字节
Keyword
为什么const
可以限制对于变量的修改?
const
: 核心机制是编译器保证,而非运行时强制
为什么 static
可以限制全局变量在源文件中的可见性?
- 默认的全局变量和函数具有外部链接(External Linkage),其他文件可以通过 extern 声明访问它们
- 用 static 修饰全局变量时,该变量会被赋予 内部链接(Internal Linkage) 属性,使其仅在当前编译单元(即当前源文件)中可见
- 可以使用匿名命名空间(Anonymous Namespace)将全局变量指定为内部链接行为
$ cat ext/ext.cc
int var1 = 1;
static int var2 = 2;
namespace {
int var3 = 3;
}
$ nm -C ext.o
0000000000000000 D var1
0000000000000004 d var2
0000000000000008 d (anonymous namespace)::var3
Memory
- .bss: 存放未初始化(包括初始化为0)的全局变量和静态变量,仅在程序加载时由系统分配内存并初始化为零
- .data: 存放已初始化(不包括初始化为0)的全局变量和静态变量,初始值会被直接写入可执行文件中,在程序加载时从磁盘加载到内存中
Leave a Reply