内联函数是怎么工作的?

shuyechengying 2013-10-14 11:35:20
如果是像宏那样代码替换,为什么下面的代码不能交换两个数?
inline void my_swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
...全文
236 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Falleyes 2013-10-16
  • 打赏
  • 举报
回复
内敛函数是把函数替换过去,但实际执行的还是函数本身。你的交换,使用值传递交换,在函数里面值传递交换只交换拷贝值。要交换原值应该只用引用或者指针
max_min_ 2013-10-15
  • 打赏
  • 举报
回复
内敛函数本身也还是函数的! 你函数本身就没有达到交换值的目的,只是值拷贝而已! 内敛函数只是一种优化手段而已,节约调用时间和资源!
晨星 2013-10-15
  • 打赏
  • 举报
回复
宏代换发生在编译之前。 内联函数不是宏代换,再怎么内联,参数传值还是传引用的语义要维持正确。换句话说,语法效果上要做到跟没有内联时完全相同。所不同的仅仅是运行效率有可能好一些。 就你这个函数来说,它既没有返回值,也没有任何其它外部可见的副作用,编译器把它直接优化没了都有可能。
shuyechengying 2013-10-15
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
会看汇编代码吗?
不会。。
lm_whales 2013-10-15
  • 打赏
  • 举报
回复
inline void my_swap(int a,int b) { int tmp = a; a = b; b = tmp; } 如果生成嵌入代码的话,可能会生成类似下面的代码: { int tmpa =a,tmpb = b; //保证 my_swap的值传递语义。 int tmp = tmpa; //交换代码,没有 a,b什么事。 tmpa =tmpb ; tmpb = tmp; } 如果进行编译优化,因为这段代码; 啥事也不做,纯属瞎忙。 全部会被优化掉,根本就不生成,任何代码。
Adol1111 2013-10-15
  • 打赏
  • 举报
回复
内联函数本身仍然是函数,所以仍然以是值传递的,而不是像宏直接在编译前展开替换。他仅仅是一种编译器优化手段,用来消除宏带来的安全隐患,他本身并不是宏,也不会取代宏。
赵4老师 2013-10-15
  • 打赏
  • 举报
回复
引用 2 楼 shuyechengying 的回复:
[quote=引用 1 楼 lianshaohua 的回复:] 会看汇编代码吗?
不会。。[/quote] 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
menzi11 2013-10-15
  • 打赏
  • 举报
回复
my_swap(int&&&&&&&&&&&&&&&&&&&&& a,int&&&&&&&&&&&&&&&&&&&&&&&&&&& b) .......
lm_whales 2013-10-15
  • 打赏
  • 举报
回复
引用 3 楼 steedhorse 的回复:
宏代换发生在编译之前。 内联函数不是宏代换,再怎么内联,参数传值还是传引用的语义要维持正确。换句话说,语法效果上要做到跟没有内联时完全相同。所不同的仅仅是运行效率有可能好一些。 就你这个函数来说,它既没有返回值,也没有任何其它外部可见的副作用,编译器把它直接优化没了都有可能。
++ ++
lm_whales 2013-10-15
  • 打赏
  • 举报
回复
引用 3 楼 steedhorse 的回复:
宏代换发生在编译之前。 内联函数不是宏代换,再怎么内联,参数传值还是传引用的语义要维持正确。换句话说,语法效果上要做到跟没有内联时完全相同。所不同的仅仅是运行效率有可能好一些。 就你这个函数来说,它既没有返回值,也没有任何其它外部可见的副作用,编译器把它直接优化没了都有可能。
编译期的作用就是这个,保证语义正确。 这样才能让程序,在程序员的控制下工作。 如果失去控制,你没有办法,保证程序能够正确工作。
buyong 2013-10-15
  • 打赏
  • 举报
回复
inline void my_swap(int& a,int& b) { int tmp = a; a = b; b = tmp; }
ztenv 版主 2013-10-14
  • 打赏
  • 举报
回复
会看汇编代码吗?

64,654

社区成员

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

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