常用的编译器变量属性设定

上传人:飞*** 文档编号:5373917 上传时间:2017-08-30 格式:DOCX 页数:6 大小:22.01KB
返回 下载 相关 举报
常用的编译器变量属性设定_第1页
第1页 / 共6页
常用的编译器变量属性设定_第2页
第2页 / 共6页
常用的编译器变量属性设定_第3页
第3页 / 共6页
常用的编译器变量属性设定_第4页
第4页 / 共6页
常用的编译器变量属性设定_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《常用的编译器变量属性设定》由会员分享,可在线阅读,更多相关《常用的编译器变量属性设定(6页珍藏版)》请在金锄头文库上搜索。

1、一. 关键字和运算符1. _align(n): 指示编译器在 n 字节边界上对齐变量。对于局部变量,n 值可为 1、2、4 或 8。 对于全局变量,n 可以具有最大为 2 的 0x80000000 次幂的任何值。 _align 关键字紧靠变量名称前面放置。 注意事项: 只能进行过对齐。也就是说,可以将两个字节的对象按 4 个字节对齐,而不能将 4 个字节的对象按两个字节对齐。 用法举例: cpp view plaincopyprint?1. _align(8) char buffer128; /* buffer 从 8 字节对齐边界开始 */ 2. 3. void foo(void) 4. 5

2、. . 6. _align(16) int i; /* 这个对齐值是不允许用在局部变量中的*/ 7. . 8. 9. 10. _align(16) int i; /* 作为一个全局变量, 这个对齐值是被允许的*/ 2. _asm:此关键字用于将信息从编译器传递到 ARM 汇编器 armasm。用法:a. 嵌入式汇编器可以使用 _asm 关键字声明或定义嵌入式汇编函数。例如: cpp view plaincopyprint?1. _asm void my_strcpy(const char *src, char *dst); b. 内联汇编器 可以使用 _asm 关键字将内联汇编合并到函数中。例

3、如: cpp view plaincopyprint?1. int qadd(int i, int j) 2. 3. int res; 4. _asm 5. 6. QADD res, i, j 7. 8. return res; 9. c. 汇编器标签可以使用 _asm 关键字为 C 符号指定汇编器标签。例如: cpp view plaincopyprint?1. int count _asm_(count_v1); / export count_v1, not count d. 已命名的寄存器变量 可以使用 _asm 关键字声明已命名的寄存器变量。例如: cpp view plaincopy

4、print?1. register int foo _asm(r0); 3._forceinline:强制编译器内联编译 C 或 C+ 函。说明:_forceinline 的语义与 C+ inline 关键字的语义完全相同。编译器尝试内联限定为 _forceinline 的函数,而不考虑其特性。但是,如果这样做导致出现问题,编译器将不内联函数。例如,递归函数仅内联到本身一次。注:此关键字具有等效的函数属性 _attribute_(always_inline)。用法举例:cpp view plaincopyprint?1. _forceinline static int max(int x, i

5、n y) 2. 3. return x y ? x : y; / always inline if possible 4. 4._inline:提示编译器在合理的情况下内联编译 C 或 C+ 函数。说明:_inline 的语义与 C+ inline 关键字的语义完全相同。用法举例:cpp view plaincopyprint?1. _inline int f(int x) 2. 3. return x*5+1; 4. 5. int g(int x, int y) 6. 7. return f(x) + f(y); 8. 5._packed:将所有有效类型的对齐边界设置为 1。这就意味着: 不

6、会插入填充以对齐压缩对象 使用未对齐的访问读取或写入压缩类型的对象。使用 _packed 限定符声明结构或联合后,_packed 将应用于该结构或联合的所有成员。成员之间或结构末尾均没有填充。必须使用_packed 声明压缩结构的所有子结构。可以单独压缩非压缩结构的整型子字段。用法:若要将结构映射到外部数据结构或访问未对齐数据,_packed 限定符非常有用;但由于访问开销相对较高,通常对节省数据大小并没有什么帮助。通过仅对需要压缩的结构中的字段进行压缩,可以减少未对齐访问的数量。注:在硬件中不支持未对齐访问的 ARM 处理器(例如,ARMv6 之前的处理器)上,访问未对齐的数据时可能会在代码

7、大小和执行速度方面产生较高的成本。必须最大限度减少通过压缩结构进行的数据访问,以避免增加代码大小和降低性能。用法举例 1 - 压缩结构cpp view plaincopyprint?1. typedef _packed struct 2. 3. char x; / 结构体所有成员都会被 _packed 限定 4. int y; 5. X; / 结构体占 5 字节,如果不使用_packed,这个结构占 8 字节 6. int f(X *p) 7. 8. return p-y; / 执行一次未对齐读数据 9. 10. typedef struct 11. 12. short x; 13. char

8、 y; 14. _packed int z; / 仅这一个变量受到_packed 约束 15. char a; 16. Y; / 这个结构体占 8 字节 17. int g(Y *p) 18. 19. return p-z + p-x; / 只有读区域 z 是未对齐的 20. 用法举例 2 - 指向压缩类型的指针cpp view plaincopyprint?1. typedef _packed int* PpI; /* 指向一个_packed int 型变量*/ 2. _packed int *p; /* 指向一个_packed int 型变量*/ 3. PpI p2; /* p2 和p的类

9、型相同 */ 4. /* _packed 可看作一个限定符*/ 5. /* 就像 const或者volatile一样 */ 6. typedef int *PI; /* 指向一个 int 型变量 */ 7. _packed PI p3; /* 一个指向正常 int 型变量的_packed 指针*/ 8. /* - p和p2 不是一个类型 */ 9. int *_packed p4; /* p4和p3的类型相同 */ 二. 函数属性1._attribute_(always_inline):此函数属性指示必须内联函数。同_forceinline。用法举例:cpp view plaincopypri

10、nt?1. static int max(int x, int y) _attribute_(always_inline) 2. 3. return x y ? x : y; / always inline if possible 4. 2._attribute_(used):指示编译器在对象文件中保留静态函数,即使将该函数解除引用也是如此。用法举例:static int keep_this(int) _attribute_(used); /*保留目标文件,编译器不进行空间优化*/3._attribute_(unused):unused 函数属性禁止编译器在未引用该函数时生成警告。这不会更改删

11、除未使用函数的过程的行为。用法举例:static int Function_Attributes_unused_0(int b) _attribute_ (unused);4. _attribute_(section(name):可以使用 section 函数属性将代码放在映像的不同节中。用法举例:在以下示例中,将 Function_Attributes_section_0 放在 RO 节 new_section 中,而不是放在.text 中。1: void Function_Attributes_section_0 (void) 2: _attribute_ (section (new_se

12、ction);3: void Function_Attributes_section_0 (void)4: 5: static int aStatic =0;6: aStatic+;7: 三. 变量属性1._attribute_(at(address):可以使用此变量属性指定变量的绝对地址。变量放在其自己的节中,编译器将为包含变量的节指定适当的类型: 只读变量放在 RO 类型的节中。 已初始化的读写变量放在 RW 类型的节中。 特别地,显式初始化为零的变量放在 RW 中,而不是放在 ZI 中。此类变量不适合编译器的 ZI 到 RW 优化。 未初始化的变量放在 ZI 类型的节中。语法:_attr

13、ibute_(at(address)其中,address 是所需的变量地址。注:链接器并非始终能够放置 at 变量属性生成的节。如果无法将节放置在指定地址,链接器将显示一条错误消息。用法举例:cpp view plaincopyprint?1. const int x1 _attribute_(at(0x10000) = 10; /* RO */ 2. int x2 _attribute_(at(0x12000) = 10; /* RW */ 3. int x3 _attribute_(at(0x14000) = 0; /* RW, not ZI */ 4. int x4 _attribute_(at(0x16000); /* ZI */ 扩展:在 Keil MDK 提供的 absacc.h 中,这样定义了宏_at:cpp view plaincopyprint?1. #ifndef _at 2. #define _at(_addr) _attribute_ (at(_addr) 3. #endif 所以只要在模块中包含 absacc.h 头文件,就可以使用_at 来指定变量的绝对地址了。2. _attribute_(zero_init):编译器不对修饰的变量进行零初始化secti

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号