问题描述
我使用库 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 的链接器):
- 某个函数是纯函数/没有需要通过调用来重现的副作用。
- 连续调用纯函数的返回值(可能对其参数类型有限制),使用相同的参数,不能返回不同的值,除非在它们之间调用了一组其他函数中的一个? (在我们的例子中,
libB::set_current_macguffin(macguffin_t new_macguffin)
)
...以某种方式使其放弃后续调用并缓存结果?
注意:
-
libA
和libB
已经编译,我无法重新编译它们。但是 - 一些 libA 的代码可能是头文件中的内联函数;或者编译器本身可能会复制 libA 代码以避免调用。 - 我将这个问题标记为“C++”,尽管它实际上适用于任何编译语言。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)