2
A
回答
1
C静态内联函数在运行时是否具有身份?
如果编译器至少选择一次不内联它,或者如果您取得该函数的地址,则静态内联函数在编译单元中具有标识。
取得的地址仅在当前编译单元(.c
文件)中有效。在另一个编译单元(另一个.c
文件)中,编译器会给你一个不同的地址。
与编译器可见的任何其他函数一样,函数中的代码可能完全或部分复制到由编译器生成的汇编代码中的各个位置。
从当前编译的.c
文件中看不到任何其他.c
文件中的静态内联函数(与任何静态函数一样)。
我应该关心该构造的命名冲突吗?
只有当你需要在头文件中定义的静态内联函数的地址,并执行以下操作:
- 静态内联函数
f
在文件a.h
a.h
定义为C包括文件x.c
和y.c
x.c
需要的f
并将其存储在地址转换成全局变量f_addr
y.c
需要的f
的地址和用于身份,进行比较,以存储在f_addr
- 所述比较将所述
false
的结果值尽管事实上在不同的抽象级别它是非常相同的功能f
如果函数是在.c文件中定义的?它是一样的吗?
从C编译器的角度来看,它与在头文件中定义函数和在.c文件中包含头文件完全相同。编译器不知道头文件,它只看到一个连续的编译单元。头文件是使用C语言的程序员脑海中存在的概念 - 从C编译器的角度来看,这个概念并不存在。
2
内联函数的命名与非内联函数的命名一样重要。该名称由编译器用于标识要调用的函数。程序员通过阅读代码也可以使用它来理解函数的作用。
在运行时,函数的名称不相关。
还要注意的是inline
关键字只有提示编译器。尽管有inline
关键字,该函数实际上可能不会内联。同样,未标记为inline
的函数可能仍由编译器内联。
1
您可能不在意命名内联函数的冲突,但我保证编译器会!
内联是编译期间的后期操作 - 编译器首先需要确定程序的调用结构,这需要编译器正确解析所有已命名的调用。
在运行时,你可以不知道任何当前正在执行的函数的名称不明确编码某种魔力,以确定它 - c
不反射。
正如Mark指出的那样,inline关键字只是一个提示 - 如果编译器决定从显式调用获得更好的性能,编译器可以自由忽略它。
相关问题
- 1. 内联函数调用静态内联函数
- 2. 静态函数,内联和模板?
- 3. 静态局部变量C99静态内联函数
- 4. 函数本地静态变量是否阻止函数内联?
- 5. 错误由于早期非静态非内联函数的静态线版本
- 6. gcc静态链接程序能否从静态库中正确内联函数?
- 7. 定义静态二维数组与内联函数
- 8. 内联成员函数使用的静态全局变量
- 9. 静态内联方法?
- 10. C#静态内联方法参数
- 11. 如何在内联函数中声明一个静态变量?
- 12. 静态模板函数可以通过编译器内联吗?
- 13. 你可以内联静态成员函数吗?
- 14. 静态库。导入和导出内联函数
- 15. 内联和静态函数调用运营商
- 16. C编译器优化(gcc):自动内联非静态函数vs静态函数
- 17. 内嵌函数中的静态变量
- 18. 静态块内的构造函数
- 19. 静态函数
- 20. 静态函数
- 21. C中的函数内的静态和C++中的类内的静态差异?
- 22. 联动的内联函数
- 23. 静态块的内联编辑
- 24. 带有静态宽度的内联div
- 25. 从静态函数写入标签
- 26. 静态函数导致更多的静态函数
- 27. 内联函数
- 28. 内联函数
- 29. 内联函数
- 30. 调用静态函数内部的基类过载函数?
最后一个问题的答案真的很好,谢谢! – Eonil 2012-03-01 15:15:15