作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些C++代码
#include <cstdio>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class A {
public:
void do_it() { std::printf("aaa"); }
};
void
call_it(const boost::function<void()> &f)
{
f();
}
void
func()
{
A *a = new A;
call_it(boost::bind(&A::do_it, a));
}
gcc 4 编译成以下程序集(来自 objdump
):
00000030 <func()>:
30: 55 push %ebp
31: 89 e5 mov %esp,%ebp
33: 56 push %esi
34: 31 f6 xor %esi,%esi
36: 53 push %ebx
37: bb 00 00 00 00 mov $0x0,%ebx
3c: 83 ec 40 sub $0x40,%esp
3f: c7 04 24 01 00 00 00 movl $0x1,(%esp)
46: e8 fc ff ff ff call 47 <func()+0x17>
4b: 8d 55 ec lea 0xffffffec(%ebp),%edx
4e: 89 14 24 mov %edx,(%esp)
51: 89 5c 24 04 mov %ebx,0x4(%esp)
55: 89 74 24 08 mov %esi,0x8(%esp)
59: 89 44 24 0c mov %eax,0xc(%esp)
; the rest of the function is omitted
这里call
指令的操作数我看不懂,为什么调用到自身,却少了一个字节?
最佳答案
调用可能是对外部函数的调用,您看到的地址 (FFFFFFFC) 只是真实地址的占位符,链接器和/或加载器稍后会处理。
关于c++ - "call"看似跳入自身的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2550822/
我正在尝试使用两个可编辑的 slickgrid 实例作为数据输入表单,我希望能够从第一个网格的最后一个单元格切换到第二个网格的第一个单元格,但以下内容没有' 似乎工作。我错过了什么? firstG
我正在通过 Alex Allain 的“Jumping into C++”等书籍学习 C++,并且正在学习递归。有一个程序示例可以计算出在出现“堆栈溢出错误”或在我的情况下出现“段错误”之前我的计算机
如果我像这个例子一样跳进一个 block ,跳过声明, #include int main(int argc, char *argv[]){ int counter = 0; goto ju
我是一名优秀的程序员,十分优秀!