有没有办法告诉编译器某些函数的返回值不会改变?

时间:2021-02-17 18:43:55

标签: c++ compiler-optimization lto

我使用库 libA,而后者又使用库 libB。现在,libB 具有“当前 macguffin”的线程本地索引。其他线程(除非它们开始写入内存中的任意位置)无法更改当前线程的“当前 macguffin”。现在,libA 不知道您不会在调用其函数之间更改当前的 macguffin,因此当您编译 libA 函数时,您会得到如下结果:

 callq  123 <libB::get_current_macguffin()+0x12>
 # other stuff here

在目标文件中。如果您进行多次 libA 调用并且不更改当前的 macguffin - 您最终会进行多次 libB::get_current_macguffin() 调用,而您不应该这样做。

现在,有没有办法告诉编译器(或执行 LTO 的链接器):

  1. 某个函数是纯函数/没有需要通过调用来重现的副作用。
  2. 连续调用纯函数的返回值(可能对其参数类型有限制),使用相同的参数,不能返回不同的值,除非在它们之间调用了一组其他函数中的一个? (在我们的例子中,libB::set_current_macguffin(macguffin_t new_macguffin)

...以某种方式使其放弃后续调用并缓存结果?

注意:

  • libAlibB 已经编译,我无法重新编译它们。但是 - 一些 libA 的代码可能是头文件中的内联函数;或者编译器本身可能会复制 libA 代码以避免调用。
  • 我将这个问题标记为“C++”,尽管它实际上适用于任何编译语言。

0 个答案:

没有答案