请教 内联函数失败产生的调用函数的问题

C821215 2009-01-19 08:57:32
比如: A.h 是一个A 类头文件,所有函数都内联, B.cpp, C.cpp 都引用了该头文件, 但A.h 中的内联函数过大,导致内联似乎会失败. 这时, 分别编译 B.cpp 与 C.cpp 将会产生 b.obj, c.obj.
请问 b.obj 中是否有 A.h 中内联失败而转成的 A.h 类的调用函数, c.obj 中是否有 A.h 中内联失败而转成的 调用函数.
如果b.obj和c.obj中都存在同样的一份调用函数. 那么,连接器在连接 b.obj 与 c.obj时,是否会丢弃其中一份函数?
...全文
238 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
C821215 2009-01-19
  • 打赏
  • 举报
回复
写在结贴之前:

......嗯...看了上面的ENGLISH 和 tangshuiling 的简体中文版....干脆找了一下 内部连接与外部连接的问题.
以下是我的结论, 可能有不少错误:

使用 static 说明仍然是将符号声明为静态本地符号, 该符号将拥有内部连接标记.

由 static 修饰的 名字空间中的自由函数,变量,const具有内部连接, 直接服务当前的单元,如果它们被包含到多个编译单元,则具有多个副本存在.
未加 static 的 名字空间中的自由函数,变量,const具有外部连接属性,因此如果在两个编译单元之中出现两个定义,会出现多重定义的符号错误.

由static 修饰的类的非 inline 成员(静态,虚拟,一般函数/数据) 具有外部连接属性,因此,它们在多个编译单元之中出现会指向同一目标,(否则就是浪费内存). 而类的所有 inline 成员函数具有内部连接属性.即应该在每个编译单元之中产生一份COPY(被插入到代码之中). 如果内联失败, 编译器将它转成一般函数, 这时,这个函数便具有了外部连接属性.

谢谢各位的回答,虽然还是有点晕头.不过大约了解了.


waizqfor 2009-01-19
  • 打赏
  • 举报
回复
mark
tangshuiling 2009-01-19
  • 打赏
  • 举报
回复
分两个方面解读楼主的问题:
一、如果内联inline成功,b.obj,c.obj都将存在同样的一份调用函数的副本!编译器把内联的函数看成了类似宏的展开
二、如果内联inline不成功,b.obj,c.obj都不存在调用函数的副本,只存在一条call A函数的指令
nineforever 2009-01-19
  • 打赏
  • 举报
回复
Windows下,inline函数会被mark成selectany,所以可以有多份定义
brookmill 2009-01-19
  • 打赏
  • 举报
回复
自己写一段代码试试就知道了
baihacker 2009-01-19
  • 打赏
  • 举报
回复
An inline function shall be defined in every translation unit in which it is used and shall have exactly the
same definition in every case (3.2). [Note: a call to the inline function may be encountered before its defi-
nition appears in the translation unit. ] If a function with external linkage is declared inline in one transla-
tion unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An
inline function with external linkage shall have the same address in all translation units. A static
local variable in an extern inline function always refers to the same object. A string literal in an
extern inline function is the same object in different translation units.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧