函数说明符
来自 cppreference.com
用于函数的声明。
本节内容不完整 原因:拆分为两个页面 |
inline
(自 C99) - 建议编译器“内联”函数,使对它的调用尽可能快。_Noreturn
(自 C11) - 指定函数不会返回到调用它的位置。
内容 |
[编辑] 语法
inline 函数声明 | |||||||||
_Noreturn 函数声明 | |||||||||
[编辑] 解释
[编辑] inline (自 C99)
inline
关键字是给编译器提供的一种优化提示。编译器可以自由地忽略此请求。
如果编译器内联函数,它会用实际的函数体替换对该函数的每次调用(不生成调用)。这避免了函数调用产生的额外开销(将数据放入堆栈并检索结果),但它可能导致可执行文件更大,因为函数的代码必须重复多次。结果类似于 函数式宏.
函数体必须在当前翻译单元中可见,这使得 inline
关键字对于实现头文件中的函数是必要的,即,没有需要编译和链接的源文件。
[编辑] inline 示例
在关闭内联的情况下,运行时间约为 1.70 秒。在开启内联的情况下,运行时间不到一秒。
运行此代码
/* inline int sum(int a, int b) { return (a + b); } int c = sum(1, 4); // If the compiler inlines the function the compiled code will be the same as writing: int c = 1 + 4; */ #include <stdio.h> #include <stdlib.h> #include <time.h> /* int sum (int a, int b) __attribute__ ((noinline)); */ static inline int sum (int a, int b) { return a+b; } int main(void) { const int SIZE = 100000; int X[SIZE],Y[SIZE],A[SIZE]; int i,j; for (i=0;i<SIZE;++i) { X[i] = rand(); Y[i] = rand(); } clock_t t = clock(); /* start clock */ for (i=0;i<5000;++i) { for (j=0;j<SIZE;++j) A[j] = sum(X[j],Y[j]); } t = clock()-t; /* stop clock */ printf("Time used: %f seconds\n", ((float)t)/CLOCKS_PER_SEC); printf("%d\n", A[0]); return EXIT_SUCCESS; }
可能的输出
Time used: 0.750000 seconds -1643747027
[编辑] _Noreturn (自 C11)
_Noreturn
关键字表明它后面的函数不会返回到调用它的函数。如果用 _Noreturn
声明的函数试图返回值,编译器通常会生成警告。
在下面的示例中,调用了 stop_now() 函数,这会导致程序立即终止(除非捕获了 SIGABRT
信号)。包含 printf() 和 return EXIT_SUCCESS; 的代码在调用 stop_now() 之后永远不会执行,执行也不会返回到 main() 函数,该函数是调用 stop_now() 的位置。
[编辑] _Noreturn 示例
运行此代码
#include <stdlib.h> #include <stdio.h> _Noreturn void stop_now() { abort(); } int main(void) { printf("Preparing to stop...\n"); stop_now(); printf("This code is never executed.\n"); return EXIT_SUCCESS; }
输出
Preparing to stop... Abort