[C 语言笔记--Day17] 让一个绝对不会 return 的 function 进行一点优化

今天在 TLPI 看到这个写法,於是来纪录一下。

大纲

  1. 什麽情况会让一个 function 绝对不会 return
  2. 不会 return ,所以呢?
  3. __attribute__((xxxx)) 语法
  4. __attribute__((noreturn))

1. 什麽情况会让一个 function 绝对不会 return

通常是处理 error 的 function,处理完之後直接 exit()

所以在写的时候已经确定他不会 return 了

以下是一个例子:

void err_exit(const char *err_msg);

void
err_exit(const char *err_msg)
{
    fprintf(stderr, "%c", err_msg);
    exit(1);
}

他 print 出错误讯息之後就会 exit 了,

所以绝对不会 return

2. 不会 return ,所以呢?

因为不会 return 所以 compiler 对於这个点有个优化的空间,

但前题是:写程序的人必须要先告诉 compiler 这个 function 有不会 return 的特性

而以下就要说明要如何告诉 compiler 这个点

3. __attribute__((xxxx)) 语法

例:

int foo() __attribute__((xxxx));   /* 要把 xxxx 替换掉 */ 

代表的就是 foo() 这个 function 有 xxxx 这个特性 (attribute)

compiler 可以针对这个 xxxx 的 attribute 来进行优化

至於 xxxx 实际上可以填上哪些 attribute ,

可参考这个网页

4. __attribute__((noreturn))

noreturn 就是其中一个 attribute

他代表的是这个 function 不会 return

所以刚刚的例子可以改成:

void err_exit(const char *err_msg) __attribute__ ((noreturn));

void
err_exit(const char *err_msg)
{
    fprintf(stderr, "%c", err_msg);
    exit(1);
}

这样写的话,compiler 就知道他可以完全不考虑这个 function 要如何 return 的问题

可以针对这点进行一点优化

参考资料


<<:  Day14 CSS基础设定_4

>>:  Day 26 : Github Actions

[Day 14] - 初探永丰银行线上收款API - 丰收款 - HASH ID计算(1)

接续昨天 根据规格书,我们要用永丰提供的四组hash值拼出hash id 可以看出,hash id会...

Day 27 - Learned Index实作(1)

前面实作初步的Learned Index并进行测试,今天我们要来实作出Learned Index的完...

学习javascript前...HTML3

学习html就是在学习如何使用标签,所以我现在要来了解各个标签的意思以及如何使用。 1.< t...

[Day21] 扩展你的设计:根据与对话发生的装置修改对白

从手机到智慧音箱,在不同装置上要考量到的情形皆有差异。 这篇文章中将先介绍Google助理可回应的...

身为与会者,控场的重要性

会议中的每个人都是可以掌控会议的节奏,因为谁也不知道控场的人哪一天也自己不受控制。因应疫情,所以先从...