gpt4 book ai didi

c++ - 如果位于头文件中的 "heavy"函数没有标记为 'inline' ,那么它的代码被编译到哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:04 27 4
gpt4 key购买 nike

我已经知道,当我将一个成员函数的定义放在一个头文件中并将该函数标记为inline时,该函数中的代码将被内联到该函数被调用的任何地方.cpp 文件,所以当涉及到编译的二进制文件时,我知道函数的代码位于何处——在依赖它的任何 .cpp 文件的编译代码中。但是,如果我没有在 header 中用 inline 标记一个函数,并且该函数的主体大到足以让编译器选择不内联它,会发生什么情况?在函数类所属的静态/动态库的上下文中,函数的代码被编译到哪里?或者它根本没有编译,函数代码的最终目的地是库客户端的已编译 .cpp?如果是后一种情况,即使我没有用 inline 标记函数的代码是否仍然被内联(因为它的代码太“重”)?最后,MSVC 编译器在这种情况下的行为是否不同于 GCC 的行为?

当然,我意识到将我想要内联的成员函数放入 .h 文件(或 .inl 文件)并将“重”函数放入 .cpp 文件会使事情变得非常清楚,但我真的很想避免破坏一个类的跨文件实现,因此很有趣。

最佳答案

当你标记一个函数inline时,你并没有强制编译器在它被调用的每个地方内联它,你只是告诉它定义是内联的并且它应该期待重复的拷贝在不同的编译单元中。对于包含 header 和调用函数的每个编译单元,实际代码将至少编译一次。

如果您不将其声明为内联,链接器应该提示该函数有多个定义,即使这些定义是相同的。

关于c++ - 如果位于头文件中的 "heavy"函数没有标记为 'inline' ,那么它的代码被编译到哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11368149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com