| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> ARM 编译器 armclang 参考指南 - 特定于编译器特定的关键字和运算符 -> 正文阅读 |
|
[C++知识库]ARM 编译器 armclang 参考指南 - 特定于编译器特定的关键字和运算符 |
第 2 章 特定于编译器的关键字和运算符总结了特定于编译器的关键字和运算符,它们是 C 和 C++ 标准的扩展。 2.1 编译器特定的关键字和运算符. 2.2 __alignof__. 2.3 __asm. 2.4 __declspec attributes. 2.5 __declspec(noinline). 2.6 __declspec(noreturn). 2.7 __declspec(nothrow). 2.8 __inline. 2.1 编译器特定的关键字和运算符.ARM? 编译器 armclang 提供了对 C 和 C++ 标准进行扩展的关键字。
2.2 __alignof____alignof__ 关键字使您能够查询类型或变量的对齐方式。 此关键字是 ARM? 编译器支持的 GNU 编译器扩展。 __alignof__(type) __alignof__(expr) 其中: type 是一个类型 expr 是一个左值。 __alignof__(type) 返回类型的对齐要求,如果没有对齐要求,则返回 1。 下面的示例显示了各种数据类型的对齐要求,首先直接来自数据类型,然后来自相应数据类型的左值: #include <stdio.h> int main(void) { int var_i; char var_c; double var_d; float var_f; long var_l; long long var_ll; printf("Alignment requirement from data type:\n"); printf(" int : %d\n", __alignof__(int)); printf(" char : %d\n", __alignof__(char)); printf(" double : %d\n", __alignof__(double)); printf(" float : %d\n", __alignof__(float)); printf(" long : %d\n", __alignof__(long)); printf(" long long : %d\n", __alignof__(long long)); printf("\n"); printf("Alignment requirement from data type of lvalue:\n"); printf(" int : %d\n", __alignof__(var_i)); printf(" char : %d\n", __alignof__(var_c)); printf(" double : %d\n", __alignof__(var_d)); printf(" float : %d\n", __alignof__(var_f)); printf(" long : %d\n", __alignof__(var_l)); printf(" long long : %d\n", __alignof__(var_ll)); } 使用以下命令编译会产生以下输出: armclang --target=arm-arm-none-eabi -march=armv8-a alignof_test.c -o alignof.axf Alignment requirement from data type: int : 4 char : 1 double : 8 float : 4 long : 4 long long : 8 Alignment requirement from data type of lvalue: int : 4 char : 1 double : 8 float : 4 long : 4 long long : 8 2.3 __asm这个关键字将信息传递给 armclang 汇编器。 内联汇编 __asm 关键字可以将内联 GCC 语法汇编代码合并到一个函数中。例如: #include <stdio.h> int add(int i, int j) { int res = 0; __asm ( "ADD %[result], %[input_i], %[input_j]" : [result] "=r" (res) : [input_i] "r" (i), [input_j] "r" (j) ); return res; } int main(void) { int a = 1; int b = 2; int c = 0; c = add(a,b); printf("Result of %d + %d = %d\n", a, b, c); } __asm 内联汇编语句的一般形式是:
code 是汇编代码。在我们的示例中,这是“ADD %[result], %[input_i], %[input_j]”。 嵌入式汇编 对于嵌入式汇编,您不能在函数声明中使用 __asm 关键字。在函数声明中使用 __attribute__((naked)) 函数属性。有关详细信息,请参阅 __attribute__((naked))。例如: __attribute__((naked)) void foo (int i); 具有 __attribute__((naked)) 函数属性的裸函数仅支持基本格式的汇编指令:
汇编标签 __asm 关键字可以为 C 符号指定程序集标签。例如: int count __asm__("count_v1"); // export count_v1, not count 2.4 __declspec 属性__declspec 关键字使您能够指定对象和函数的特殊属性。 __declspec(noreturn) void overflow(void); 可用的 __declspec 属性如下:
__declspec 属性是存储类修饰符。它们不影响函数或变量的类型。 2.5 __declspec(noinline)__declspec(noinline) 属性在函数调用点抑制函数的内联。 此 __declspec 属性具有等效的函数属性 __attribute__((noinline))。 /* Prevent y being used for optimization */ __declspec(noinline) const int y = 5; /* Suppress inlining of foo() wherever foo() is called */ __declspec(noinline) int foo(void); 2.6 __declspec(noreturn)__declspec(noreturn) 属性断言函数永远不会返回。 此 __declspec 属性具有等效的函数属性 __attribute__((noreturn))。 使用此属性可降低调用从不返回的函数的成本,例如 exit()。如果 noreturn 函数返回其调用者,则行为未定义。 调用 noreturn 函数时不保留返回地址。这限制了调试器显示调用堆栈的能力。 __declspec(noreturn) void overflow(void); // never return on overflow int negate(int x) { if (x == 0x80000000) overflow(); return -x; } 2.7 __declspec(nothrow)__declspec(nothrow) 属性断言对函数的调用永远不会导致 C++ 异常从被调用者传播到调用者。 此 __declspec 属性具有等效的函数属性 __attribute__((nothrow))。 如果编译器知道一个函数永远不会抛出异常,它可能会为该函数的调用者生成更小的异常处理表。 如果对函数的调用导致 C++ 异常从被调用者传播到调用者,则行为未定义。 struct S { ~S(); }; __declspec(nothrow) extern void f(void); void g(void) { S s; f(); } 2.8 __inline__inline 关键字向编译器建议它内联编译 C 或 C++ 函数,如果这样做是明智的。 static __inline int f(int x){ return x*5+1; } int g(int x, int y){ return f(x) + f(y); } |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:42:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |