外部内联函数在所有翻译单元中必须具有相同的地址.这到底是怎么实现的?
Extern inline functions must have the same address in all translation units. How the heck is that achieved?
根据标准,外部内联函数在所有翻译单元中必须使用相同的地址。
如何在编译器中实现?我的意思是,当我编译某个翻译单元时,我不知道另一个TU会是什么样子。那么我怎么能在所有地方都有相同的地址呢?
这取决于实现,但通常由链接器解决。每个编译的翻译单元都会产生一个包含函数副本的目标文件,并以某种方式标记,以便链接器知道它应该期望(并接受)副本。链接器将包含其中一个,丢弃其他的,并解析对该函数的所有引用。
简单的策略:每次定义这样的inline
函数时,将其编译为对象时间,就像它是一个普通函数一样。然后,在链接时,检测重复的函数并删除它们,留下每个函数的一个副本。这就是大约10年前c++编译器的工作方式(也面对模板)。不知道他们现在是怎么做到的。
相关文章:
- 将数组的地址分配给变量并删除
- 如果没有malloc,链表实现将失败
- 空基优化子对象的地址
- 如何在c++中实现处理器调度模拟器
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 如何在BST的这个简单递归实现中消除警告
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 使用双LL在C++中实现Stack失败,出现异常"EXC_BAD_ACCESS(代码=2,地址=0x7fff5
- C 规范是否可以通过传递堆栈框架地址偏移来关闭实现
- 将地址和布尔值存储在一个单词中,以实现无锁双链表
- 外部内联函数在所有翻译单元中必须具有相同的地址.这到底是怎么实现的?
- 实现地址
- 一个实现是否允许在同一地址放置两个相同的函数定义