1 、static 的用法(定义和用途)
1)用 static 修饰局部变量:使其变为静态存 储方式(静态数据区),那么这个局部变量在函 数执行完成之 后不会被释放,而是继续保留在内存中。
2)用 static 修饰全局变量:使其只在本文件 内部有效,而其他文件不可连接或引用该变量。
3)用 static 修饰函数:对函数的连接方式产 生影响,使得函数只在本文件内部有效,对其 他文件是不可 见的(这一点在大工程中很重要很重要,避免 很多麻烦,很常见)。这样的函数又叫作静态 函数。使用 静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种 保护机制。
2、const 的用法(定义和用途)
const 主要用来修饰变量、函数形参和类成员 函数:
1)用 const 修饰常量:定义时就初始化,以 后不能更改。
2)用 const 修饰形参:func(const int a){}; 该形参在函数里不能改变
3)用 const 修饰类成员函数:该函数对成员 变量只能进行只读操作,就是 const 类成员函 数是不能修改 成员变量的数值的。 被 const 修饰的东西都受到强制保护,可以预 防意外的变动,能提高程序的健壮性。
3、volatile 作用和用法
一个定义为 volatile 的变量是说这变量可能 会被意想不到地改变,这样,编译器就不会去 假设这个变量的 值了。精确地说就是,优化器在用到这个变量 时必须每次都小心地重新读取这个变量在内 存中的值,而 不是使用保存在寄存器里的备份(虽然读写寄 存器比读写内存快)。 回答不出这个问题的人是不会被雇佣的。这是 区分 C 程序员和嵌入式系统程序员的最基本的 问题。搞嵌 入式的家伙们经常同硬件、中断、RTOS 等等打 交道,所有这些都要求用到 volatile 变量。 不懂得 volatile 的内容将会带来灾难。
以下几种情况都会用到 volatile:
1、并行设备的硬件寄存器(如:状态寄存器)
2、一个中断服务子程序中会访问到的非自动 变量
3、多线程应用中被几个任务共享的变量
4、经典的sizeof(struct)和 sizeof(union) 内存对齐
内存对齐作用:
1.平台原因(移植原因):不是所有的硬件平台 都能访问任意地址上的任意数据的;某些硬件 平台只能在某 些地址处取某些特定类型的数据,否则抛出硬 件异常。
2.性能原因:数据结构(尤其是栈)应该尽可能 地在自然边界上对齐。原因在于,为了访问未 对齐的内存, 处理器需要作两次内存访问;而对齐的内存访 问仅需要一次访问。
结构体 struct 内存对齐的 3 大规则:
1.对于结构体的各个成员,第一个成员的偏移 量是 0,排列在后面的成员其当前偏移量必须 是当前成员类型的整数倍;
2.结构体内所有数据成员各自内存对齐后,结 构体本身还要进行一次内存对齐,保证整个结 构体占用内存大小是结构体内最大数据成员 的最小整数倍;
3.如程序中有#pragma pack(n)预编译指令, 则所有成员对齐以 n 字节为准(即偏移量是 n 的整数倍),不再考虑当前类型以及最大结构 体内类型。