外部内联函数在所有翻译单元中必须具有相同的地址.这到底是怎么实现的?

Extern inline functions must have the same address in all translation units. How the heck is that achieved?

本文关键字:地址 实现 函数 翻译 单元 外部      更新时间:2023-10-16

根据标准,外部内联函数在所有翻译单元中必须使用相同的地址。

如何在编译器中实现?我的意思是,当我编译某个翻译单元时,我不知道另一个TU会是什么样子。那么我怎么能在所有地方都有相同的地址呢?

这取决于实现,但通常由链接器解决。每个编译的翻译单元都会产生一个包含函数副本的目标文件,并以某种方式标记,以便链接器知道它应该期望(并接受)副本。链接器将包含其中一个,丢弃其他的,并解析对该函数的所有引用。

简单的策略:每次定义这样的inline函数时,将其编译为对象时间,就像它是一个普通函数一样。然后,在链接时,检测重复的函数并删除它们,留下每个函数的一个副本。这就是大约10年前c++编译器的工作方式(也面对模板)。不知道他们现在是怎么做到的。