盒子
盒子
文章目录
  1. auto
  2. register
  3. static
  4. extern
  5. typedef

C 语言再复习 -- 储存类型关键字

C 语言有5个存储类说明符的关键字

auto

auto 在C语言中只有修饰局部变量这一个作用。表示这个局部变量是自动局部变量,自动局部变量分配在栈上,如果没有
初始化,则值是随机的。

局部变量默认是auto的,可写可不写。但是若省去数据类型,默认是int类型

1
2
3
4
5
6
7
8
void testAutoKeyword(void) {
auto int a = 10; // the same as int a = 10;
auto b = 9; // default type is int
auto c; // not initialized , value is random

printf("sizeof (b) = %d\n", sizeof(b));
printf("c = %d\n", c);
}

register

在C语言中register修饰的变量表示此变量存储在CPU的寄存器中。

  • 用register修饰的变量只能是局部变量,不能是全局变量。CPU的寄存器资源有限,因此
    不可能让一个变量一直占着CPU寄存器
  • register变量一定要是CPU可以接受的值
  • 不可以用&运算符堆register变量进行取值,因为&是对内存上的变量有用,而register变量
    在CPU上,不起作用
  • register只是请求寄存器变量,不一定会被满足。由C编译环境决定,所以这个register变量
    仅仅是暗示不是命令

Register 关键字会尽量把变量放在寄存器上,而不是栈或者堆上,从而加快存取速度。举个测试的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <sys/timeb.h>

#define TIME 1000000000

// global variables
int m = 0;
int n = TIME;

long long getSystemTime() {
struct timeb t;
ftime(&t);
return 1000 * t.time + t.millitm;
}

void testRegisterKeyword(void) {
// define register variable
register int a = 0;
register int b = TIME;

// define local variable
int x = 0;
int y = TIME;

long long start = 0;
long long end = 0;

start = getSystemTime();
for (a = 0; a < b; a++);
end = getSystemTime();
printf("寄存器变量用时: %lld ms\n", end - start);

start = getSystemTime();
for (x = 0; x < y; x++);
end = getSystemTime();
printf("局部变量用时: %lld ms\n", end - start);


start = getSystemTime();
for (m = 0; m < n; m++);
end = getSystemTime();
printf("全局变量用时: %lld ms\n", end - start);

}

在mac上 register 变量用时反而是最长的 :(

static

extern

typedef

支持一下
扫一扫,支持forsigner
  • 微信扫一扫
  • 支付宝扫一扫