微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我使用库 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++”,尽管它实际上适用于任何编译语言。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。