c - 在 c 中返回 likely(x) 它是如何工作的?

标签 c

有人可以告诉我这段代码是否:

int a = 1;
int b = 0;
if (likely(a >= b))
    return 1;

做同样的这个吗?

return (likely(a>= b))

非常感谢您的帮助。

最佳答案

likely 不是 C 语言的一部分。它必须由您看到它的代码的上下文以某种方式定义。 (它可能是一个扩展为编译器特定构造的宏,它告诉编译器a >= b 可能为真,这有助于优化。但是从您显示的代码中,我们不确定。)

假设 like 确实是这样一个宏,我们可以将其删除并继续处理您的实际问题:

if (a >= b)
    return 1;

相同
return a >= b;

因为当 a 小于 b 时它们会做不同的事情。 return a >= b; 当 a 小于 b 时返回零,但是 if (a >= b) return 1; 继续到 if 语句下面的任何内容当 a 小于 b 时。

等价于 return a >= b; 的两个构造是

if (a >= b)
    return 1;
else
    return 0;

if (a >= b)
    return 1;
return 0;

大多数有经验的 C 程序员宁愿看到 return a >= b; 而不是其中之一。

[附录:return likely(a >= b); 写起来很奇怪,因为函数将以任何一种方式返回,并且设置返回值的代码很短,简单,并且(通常)无分支。可以想象,它可以为 interprocedural optimization 提供提示。 , 但将这种提示表达为函数原型(prototype)上的注释会更自然,例如

extern int fstat(int fd, struct stat *st)
    __attribute__((expected_return_value(0)));

(注意:据我所知,这不是真正的 GCC 函数注释。)]

关于c - 在 c 中返回 likely(x) 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39234508/

相关文章:

c - c编程中的结构和循环问题

c - sizeof 对结构的不完整类型的无效应用

C - 为什么 fopen(filename, "r") 之后 fp == NULL true?

c - 使用宏时出错

c - 在 CUDA C 中取消引用指针

c - 编译器优化应用于哪个级别?

c结构数组的cython内存 View

c - 字符数组的函数?

c - 如何设置Unicode控件的字体?

c - c中的插入排序,需要修正