繁体   English   中英

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

[英]How to communicate range information to C++ compiler?

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

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);

通常这些工具也能够自行分析诸如“条件”之类的事情,因此没有特别需要这样做。

此外,如果范围非常小,您还可以将其表示为较小的变量 - 例如使用short或char - 并添加COMPILE_TIME_MIN 这可以帮助这些工具,虽然我不知道编译本身。

最后,正如在所有优化方法中一样,我建议首先分析您的代码,看看这是否真的是一个瓶颈。 另外,请记住编译器是为优化“普通”代码而设计的 - 手工优化当然可以提供帮助,只需仔细处理即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM