这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » C语言中关键词 volatile packed constant

共1条 1/1 1 跳转至

C语言中关键词 volatile packed constant

助工
2014-11-04 19:26:39     打赏

C语言中几个特殊的关键词       在这里我只是简单地介绍一下volatile、__packed和const的作用,省得我们在看到它们的时候不知所措。


volatile关键词


       volatile的中文意思是“易挥发的”,它主要是给编译器提个醒,告诉编译器对于volatile变量不要轻易的进行优化,因为在程序运行过程中这个值会被其他的任务或硬件改变。在编译器中对于语句通常会做一些优化,例如有如下程序:


 


       bool bExit == FALSE;


       …


       for(;;)


       {


              …


              if(bExit)


              {


                     break;


              }


}


 
 


假设现在有另一个任务或线程通过bExit来控制程序的退出。如果此时变量不使用volatile关键字说明的话,编译时就会对if(bExit)进行优化,不再在每一次for循环中判断bExit了,这样就会导致程序运行错误。因此,此时应使用volatile关键字说明bExit变量,这样编译器就不会做这样的优化了。


__packed关键词


__packed用来声明结构体采用单字节偏移。并不是所有的编译器都支持这个选项。使用__packed声明的结构体会压缩空间。例如有下面一个结构体:


struct _Test{


       int a;


       char b;


       char c;


       int d;


}Test;
 


如果不使用__packed声明,在ARM编译器中sizeof(Test)等于12(在ARM编译器中是4字节偏移,int也是4字节变量)。加入__packed说明后,sizeof(Test)等于10,编译器会压缩Test结构体中b、c和d变量之间的padding字节。对比示意图如下:


       int a;


(4 B)
 


 


char b;(1B)


 
 


 


char c;(1B)


 
 


 


       intd;


(4 B)


 
 


 


int a;


(4 B)


 
 


 


char b;(1B)
 


 


char c;(1B)


 
 


 


       int d;


(4 B)


 
 


 


Padding


(2B)


 
 


 


无__packed
 


 


有__packed


 
 


图  结构体内存映射


       从这个图中可以看出,经过__packed说明之后的结构体,相对于没有使用__packed说明的节省了2字节的padding存储空间,实际上这给我们提供了一种紧凑数据的方法。


const关键词


       使用const的好处在于它允许指定一种语意上的约束——某种数据不能被修改——编译器具体来实施这种约束。通过const,我们可以告知编译器和其他程序员某个值要保持不变。只要是这种情况,我们就要明确地使用const ,因为这样做就可以借助编译器的帮助确保这种约束不被破坏。


对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const:


char *p            = "hello";    // 非const指针, 非const数据


const char *p       = "hello";    // 顶一下


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]