当内联函数实际替换代码时,是否可以放置断点
When inline function actually replaces the code and is it possible to put a break point?
我对下面提到的内联函数有一些疑问。
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)是的,这是可能的,特别是考虑到许多IDE使用宏技巧(和其他东西),在"调试"模式下不删除代码。
3)如果函数是内联的,它实际上是插入到每个调用位置的代码,而不是指向被调用函数的指针。4)无法回答这个问题,因为我对GCC几乎没有经验。不过,"释放"模式更可能设置内联。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 有条件的断点修饰符以查看数组是否已更改
- 是否使用通配符设置断点
- DTN_DATETIMECHANGE断点和日期时间选取器控件是否存在问题
- 是否有可能在调试版本中编译VS项目,包括通过不同的项目进行调试的断点
- 是否有一种方法来测试我们是否在一个断点上,使用纯gdb脚本
- 是否有一种方法可以将一个条件设置为gdb中的所有断点,用于调试Cpp代码
- 是否有一种方法可以使编译器在catch子句中自动命中语句(断点)
- 如何放置条件断点来测试CString变量是否为空
- 当内联函数实际替换代码时,是否可以放置断点
- 是否有一种方法可以启用/禁用除ID之外的断点