当内联函数实际替换代码时,是否可以放置断点

When inline function actually replaces the code and is it possible to put a break point?

本文关键字:是否 断点 代码 函数 替换      更新时间:2023-10-16

我对下面提到的内联函数有一些疑问。

1)我读到内联函数的函数调用将在编译时被代码替换。如果这是真的,有谁能告诉我它是如何与虚函数一起工作的,因为虚函数是一个基于后期绑定的概念。

2)是否有可能在内联函数中放置断点?

3)如果一个内联函数只是简单地替换函数调用,如果内联函数有一个返回语句,为什么内联函数的调用者不终止与内联函数的返回语句?

4)是否有任何方法可以强制gcc编译器使用内联函数而不仅仅是对编译器的建议?

1)简单的回答:大多数情况下它不能与虚函数一起工作。参见内联虚函数真的没有意义吗?查看更详细的答案。

2)是的,你可以。编译器通常不会对调试版本执行任何内联。

3)当然,编译器不会把"ret"汇编指令放在调用代码中。这样想:

// before inlining:
int MyFunc () { return 5; }
int i = MyFunc();
// after inlining:
int i = 5;

4)参见这里的答案:我如何强制gcc内联一个函数?

顺便说一句:使用谷歌会在更短的时间内回答你所有的问题;-)

  1. 虚函数不会内联,除非在编译时知道对象的类型(例如,调用是用对象而不是引用或指针进行的)。

  2. 如果在调试模式下编译(几乎每个编译器都支持),可以在内联函数中放置断点。在调试版本中,函数不内联。

  3. 内联函数不是简单地复制,那将是错误和愚蠢的。调用被智能地替换为相应的代码。

1)虚函数不会被内联,除非编译器"看到"在不同情况下会调用相同的代码(不太可能发生)。

2)是的,这是可能的,特别是考虑到许多IDE使用宏技巧(和其他东西),在"调试"模式下不删除代码。

3)如果函数是内联的,它实际上是插入到每个调用位置的代码,而不是指向被调用函数的指针。

4)无法回答这个问题,因为我对GCC几乎没有经验。不过,"释放"模式更可能设置内联。