如何将范围信息传递给c++编译器

How to communicate range information to C++ compiler?

本文关键字:c++ 编译器 信息 范围      更新时间:2023-10-16

是否有任何方法可以指示编译器,您知道特定变量的值必须在代码中的某个点的特定范围内,以帮助编译器进行优化?我正在编写一个库,它可以在编译时知道一些变量的范围,如果它能以某种方式将这些信息传递给编译器,以便编译器可以使用它进行优化,那将是非常棒的。我想添加对任何编译器的支持,即使它不能为所有编译器工作(这听起来像是一些编译器可以作为扩展的那种东西,但我还没有找到任何)。我知道我可以这样写:

if(x < COMPILE_TIME_MIN or x > COMPILE_TIME_MAX)
    return;
// compiler will assume for code below that x is in range COMPILE_TIME_MIN..COMPILE_TIME_MAX

但那是运行时检查。也许有一些技巧可以让编译器在没有检查的情况下对范围做出假设?

任何这样的"提示"都是特定于编译器的。

作为一个例子,Visual c++允许您使用__assume的内在提供这样的提示。

(其他编译器也可能提供这样的内在特性,但我对其他编译器不够熟悉,无法提供任何进一步的信息。如果有兴趣,请参考编译器的文档)

这不是标准的,但是在gcc中,有一个名为__builtin_expect的命令,其中定义为likelyunlikely的宏可以满足您的目的。参见这里的例子,它讨论了在内核空间中使用它们,但__builtin_expect是一个gcc扩展,也可以在用户空间中使用(参见这个问题),即使likelyunlikely没有定义。

我不知道有任何c++编译技术利用了这些信息,但我知道有各种静态分析技术利用了这些信息;"告诉"这些工具的常见方式是通过assert,例如:

assert(x > COMPILE_TIME_MIN);
assert(x < COMPILE_TIME_MAX);

但是通常这些工具也能够自己分析诸如"if条件"之类的东西,所以没有特别需要这样做。

另外,如果范围真的很小,你也可以用一个更小的变量来表示它——例如使用short或char——并添加COMPILE_TIME_MIN。这可以帮助这些工具,尽管我不知道编译本身。

最后,与所有优化方法一样,我建议首先分析代码,看看这是否真的会成为瓶颈。另外,请记住,编译器是为优化"正常"代码而设计的——手动优化当然有帮助,只是要小心。