b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

使用C语言自动注册static const volatile

电脑杂谈  发布时间:2020-05-14 11:07:28  来源:网络整理

c   类 static 函数_c语言中static 函数_c   类 static 函数

1)自动

此关键字用于声明变量的生存期是自动的,即,未在任何类,结构,枚举,联合和函数中定义的变量被视为全局变量,而在函数中定义的变量被视为局部变量变量. 这个关键字写得不多,因为默认情况下所有变量都是自动的.

(2)注册

此关键字指示编译器将变量尽可能多地存储在CPU内部寄存器中,而不是通过内存寻址进行访问以提高效率.

(3)静态

两个常见用途:

1>调用统计函数的次数;

2>减少本地数组创建和分配的开销. 变量的创建和分配需要一定数量的处理器开销,尤其是包含更多元素(例如数组)的存储类型. 在某些包含许多变量且经常调用的函数中,可以将某些数组声明为静态类型,以减少创建或初始化这些变量的成本.

详细说明:

1>,该变量将被放置在程序的全局存储区中,以便在下次调用时可以保留原始分配. 这就是堆栈变量和堆变量之间的区别.

2>变量使用静态变量通知编译器它们仅在变量范围内可见. 这是它和全局变量之间的区别.

3>当使用static修改全局变量时,它将更改全局变量的范围,以便它不能被其他程序外部使用,并被限制在当前文件中,但不会更改其存储位置. 静态存储区.

使用说明:

1>如果仅在单个C文件中访问全局变量,则可以将此变量修改为静态全局变量,以减少模块之间的耦合;

c   类 static 函数_c语言中static 函数_c   类 static 函数

2>如果仅通过单个函数访问全局变量,则可以将此变量更改为函数的静态局部变量,以减少模块之间的耦合;

3>在设计和使用访问动态全局变量,静态全局变量和静态局部变量的函数时,需要考虑重入问题(只要输入数据相同,就应产生相同的输出).

(4)const

由const修改的内容受到强制保护,可以防止意外更改并提高程序的健壮性. 它可以修改函数参数c 类 static 函数,返回值,甚至函数定义的主体.

功能:

1>修改输入参数

a. 对于非内部数据类型的输入参数,应将“值传递”的方法更改为“常量参考传递”,以提高效率. 例如,将void Func(A a)更改为void Func(const A&a).

b. 对于内部数据类型的输入参数,请勿将“值传递”方法更改为“常量引用传递”. 否则,达不到提高效率的目的,并且功能的清晰度降低. 例如,不应将void Func(int x)更改为void Func(const int&x).

2>用const修改函数的返回值

a. 如果在“指针传递”模式下向函数返回值添加const修饰符,则不能修改函数返回值(即指针)的内容,并且只能将返回值分配给指针的指针. 具有const修改的相同类型.

例如: const char * GetString(void);

以下语句中将发生编译错误:

char * str = GetString(); //无法从'const char *'转换为'char *';

正确的用法是:

c   类 static 函数_c语言中static 函数_c   类 static 函数

const char * str = GetString();

b. 如果函数返回值采用“值传递方法”,则由于该函数会将返回值复制到外部临时存储单元c 类 static 函数,因此添加const修改将没有值. 例如,请勿将函数int GetInt(void)编写为const int GetInt(void).

3>在const成员函数的声明中,只能将const关键字放在函数声明的末尾,指示此类的成员不会修改该对象.

说明:

const类型m; //将m修改为不可更改

示例:

typedef char * pStr; //新型pStr;

字符字符串[4] =“ abc”;

const char * p1 =字符串;

p1 ++; //是的,上面的修改是* p1,p1变量

const pStr p2 =字符串;

p2 ++; //错误,上面的修改是p2,p2不是变量,* p2是变量

类似地,当使用const修改指针时,不会被该原理所混淆.

const int *值; // *值是不变的,值是可变的

c语言中static 函数_c   类 static 函数_c   类 static 函数

int *常量值; //值不可变,*值不可变

const(int *)值; //(int *)是一种类型,值是不可变的,*值是可变的

//从逻辑上理解编译无法通过,并且tydef int * NewType;

const int *常量值; // *值,值不可更改

(5)易挥发

表示变量的值可以在外部更改. 优化器每次使用此变量时都必须仔细重新读取此变量的值,而不是使用保存在寄存器中的备份. 它可以应用于基本类型,例如: int,char,long ...,还可以应用于C结构和C ++类. 在结构或类对象上使用易失性修饰时,该结构或类的所有成员都将被视为易失性.

该关键字通常在多线程环境中使用,因为在编写多线程程序时,同一变量可能会被多个线程修改,并且程序会通过该变量同步每个线程.

简单的例子:

DWORD __stdcall threadFunc(LPVOID信号)

{

int * intSignal = reinterpret_cast(信号);

* intSignal = 2;

同时(* intSignal!= 1)

睡眠(1000);

c   类 static 函数_c   类 static 函数_c语言中static 函数

返回0;

}

当线程启动时,将intSignal设置为2,然后循环等待直到intSignal为1退出. 显然,必须从外部更改intSignal的值,否则该线程将不会退出. 但是,即使在外部将其值更改为1,该线程在实际运行时也不会退出,通过查看相应的伪汇编代码可以清楚地看到该线程:

移动斧头,信号

标签:

如果(ax!= 1)

转到标签

对于C编译器,它不知道此值将被其他线程修改. 自然地将其缓存在寄存器中. C编译器没有线程的概念,这一次您需要使用volatile. volatile的原始含义是: 可以在当前线程之外更改此值. 换句话说,我们需要在threadFunc的intSignal前面添加volatile关键字. 此时,编译器知道该变量的值将在外部更改,因此每次访问该变量时都会再次读取该变量,并且循环变为如下伪代码所示:

标签:

移动斧头,信号

如果(ax!= 1)

转到标签

注意: 参数可以是const和volatile,也可以是volatile,因为它可能会意外更改. 之所以为const,是因为该程序不应尝试对其进行修改.

(6)外部

extern的意思是“外来”……其目的是告诉编译器: 使用此变量,它可能不存在于当前文件中,但必须存在于源文件或项目Dll输出中的文件中.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-209741-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...