我知道void *function()
是指向一个函数的指针,但我不知道它们的工作方式有多不同,当我们使用void *function()
时? 我在装配中做了一些研究,以比较它们在幕后的工作方式,看起来像是一样的。 这里是C++代码:“void function()”和“void * function()”有什么区别?
void *bar(){
std::cout << "bar" << std::endl;
}
void foo(){
std::cout << "foo" << std::endl;
}
int main(void){
foo();
bar();
return 0;
}
这是汇编指令我从objdump的
void *bar(){
400846: 55 push %rbp
400847: 48 89 e5 mov %rsp,%rbp
std::cout << "bar" << std::endl;
40084a: be 84 09 40 00 mov $0x400984,%esi
40084f: bf 60 10 60 00 mov $0x601060,%edi
400854: e8 b7 fe ff ff callq 400710 <[email protected]>
400859: be 30 07 40 00 mov $0x400730,%esi
40085e: 48 89 c7 mov %rax,%rdi
400861: e8 ba fe ff ff callq 400720 <[email protected]>
}
400866: 90 nop
400867: 5d pop %rbp
400868: c3 retq
0000000000400869 <_Z3foov>:
void foo(){
400869: 55 push %rbp
40086a: 48 89 e5 mov %rsp,%rbp
std::cout << "foo" << std::endl;
40086d: be 88 09 40 00 mov $0x400988,%esi
400872: bf 60 10 60 00 mov $0x601060,%edi
400877: e8 94 fe ff ff callq 400710 <[email protected]>
40087c: be 30 07 40 00 mov $0x400730,%esi
400881: 48 89 c7 mov %rax,%rdi
400884: e8 97 fe ff ff callq 400720 <[email protected]>
}
400889: 90 nop
40088a: 5d pop %rbp
40088b: c3 retq
000000000040088c <main>:
int main(void){
40088c: 55 push %rbp
40088d: 48 89 e5 mov %rsp,%rbp
foo();
400890: e8 d4 ff ff ff callq 400869 <_Z3foov>
bar();
400895: e8 ac ff ff ff callq 400846 <_Z3barv>
return 0;
40089a: b8 00 00 00 00 mov $0x0,%eax
}
40089f: 5d pop %rbp
4008a0: c3 retq
一个函数被声明为返回一个“通用”指针。另一个函数被声明为不返回任何内容。' –
您是否检查过编译器的警告?第一个功能看起来不太正确。 –
'bar'返回一个'void'指针,而'foo'什么也不返回。如果这本身没有差别,那么在继续之前,你需要阅读一本好书。 –