如何将范围信息传递给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
的命令,其中定义为likely
和unlikely
的宏可以满足您的目的。参见这里的例子,它讨论了在内核空间中使用它们,但__builtin_expect
是一个gcc扩展,也可以在用户空间中使用(参见这个问题),即使likely
和unlikely
没有定义。
我不知道有任何c++编译技术利用了这些信息,但我知道有各种静态分析技术利用了这些信息;"告诉"这些工具的常见方式是通过assert
,例如:
assert(x > COMPILE_TIME_MIN);
assert(x < COMPILE_TIME_MAX);
但是通常这些工具也能够自己分析诸如"if条件"之类的东西,所以没有特别需要这样做。
另外,如果范围真的很小,你也可以用一个更小的变量来表示它——例如使用short或char——并添加COMPILE_TIME_MIN
。这可以帮助这些工具,尽管我不知道编译本身。
最后,与所有优化方法一样,我建议首先分析代码,看看这是否真的会成为瓶颈。另外,请记住,编译器是为优化"正常"代码而设计的——手动优化当然有帮助,只是要小心。
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 为什么C++编译器没有检测到正确声明的类?