background image

到。
6. __declspec( naked )  
对于没有用 naked 声明的函数一般编译器都会产生保存现场(进入函数时编译器会产
生代码来保存 ESIEDIEBXEBP

 ——

寄存器

prolog)和清除现场(退出函数时则

——

产生 代码恢复 这些寄存 器的内容

epilog

 

) 代码, 而对于用 naked 声明的函数一般

不会产生这些代码,这个属性对于写设备驱动程序非常有用,我们自己可以写这样一
个过 程,它仅 支持 x86 naked 只对函数有效,而对类型定义无效。对于一个标志了
naked 的函数不能产生一个内联函数即时使用了__forceinline 

 

关键字。

e.g__declspec ( naked ) func()
{
int i;
int j;
__asm    /* prolog */
{
push ebp
mov    ebp, esp
sub    esp, __LOCAL_SIZE
}
/* Function body */
__asm    /* epilog */
{
mov    esp, ebp
pop    ebp
ret
}

7. restrict 

 

和 noalias 

__declspec(restrict) 

 

和 __declspec(noalias)用于提高程序性能,优化程序。这两个关键

字 都 仅用 于 函 数, restrict 针对于函数返回指针, restrict 说明函数返回值没有被别名
化,返回的指针是唯一的,没有被别的函数指针别名花,也就是说返回指针还没有被

 

用过是唯一的。编译器一般会去检查指针是否可用和 是否被别名化,是否已经在使用,
使用了这个关键字,编译器就不在去检查这些信息了。 noalias 意味着函数调用不能修
改或引用可见的全局状态并且仅仅修改指针参数直接指向的内存。如果一个函数指定了
noalias

 

关键 字,优化 器认为除 参数自生 之外, 仅仅参 数指针第 一级间接 是被引用 或

修改在函数内部。可见全局状态是指没有定义或引用在编码范围外的全部数据集,它

 

们的直至不可以取得。编码范围是指所有源 文件或单个源文件。其实这两个关键字就是
给编译器了一种保证,编译器信任他就不在进行一些检查操作了。

e.g
#include <stdio.h>
#include <stdlib.h>
#define M 800#define N 600#define P 700float * mempool, * memptr;
__declspec(restrict) float * ma(int size)