c++ Empty template function returns 非空函数指针
c++ Empty template function returns non-empty function pointer
我被模板函数的函数指针搞糊涂了
见
#include <cstdio>
class A
{
public:
A(){}
~A(){}
void command()
{
printf("Cmd");
}
};
template<class T>
void cmd_create()
{
T t;
t.command();
};
int main()
{
typedef void(*Funcptr)();
Funcptr f1 = &cmd_create<A>;
f1();
return 0;
}
程序输出Cmd
.
程序集 (-O3) 表明
.file "test.cpp"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "Cmd"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB38:
.cfi_startproc
leaq .LC0(%rip), %rsi
subq , %rsp
.cfi_def_cfa_offset 16
movl , %edi
xorl %eax, %eax
call __printf_chk@PLT
xorl %eax, %eax
addq , %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE38:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
显然,&cmd_create<A>
return 是 A::command。
将cmd_create定义为一个空的return(void),但是,代码仍然得到A::command
这样的奇怪的方式。
感谢您的回答!
Obviously, &cmd_create returns the A::command.
我对汇编不是很流利,但显然你误解了代码 ;)。
&cmd_create<A>
是指向函数 cmd_create<A>
的指针。这个函数指针赋值给f1
。指针的类型为 void(*)()
,指向返回 void
且无参数的函数的指针。代码 returns 中没有任何功能(如果我们不计算 printf
或 main
)。
f1();
调用f1
指向的函数。即:cmd_create<A>
。该函数创建一个 A
类型的对象并调用它的 command
成员函数,打印您在屏幕上看到的输出。
启用优化意味着编译器发出具有相同可观察行为的东西。它可以发出与 int main() { printf("Cmd"); }
.
相同的信号
我被模板函数的函数指针搞糊涂了
见
#include <cstdio>
class A
{
public:
A(){}
~A(){}
void command()
{
printf("Cmd");
}
};
template<class T>
void cmd_create()
{
T t;
t.command();
};
int main()
{
typedef void(*Funcptr)();
Funcptr f1 = &cmd_create<A>;
f1();
return 0;
}
程序输出Cmd
.
程序集 (-O3) 表明
.file "test.cpp"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "Cmd"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB38:
.cfi_startproc
leaq .LC0(%rip), %rsi
subq , %rsp
.cfi_def_cfa_offset 16
movl , %edi
xorl %eax, %eax
call __printf_chk@PLT
xorl %eax, %eax
addq , %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE38:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
显然,&cmd_create<A>
return 是 A::command。
将cmd_create定义为一个空的return(void),但是,代码仍然得到A::command
这样的奇怪的方式。
感谢您的回答!
Obviously, &cmd_create returns the A::command.
我对汇编不是很流利,但显然你误解了代码 ;)。
&cmd_create<A>
是指向函数 cmd_create<A>
的指针。这个函数指针赋值给f1
。指针的类型为 void(*)()
,指向返回 void
且无参数的函数的指针。代码 returns 中没有任何功能(如果我们不计算 printf
或 main
)。
f1();
调用f1
指向的函数。即:cmd_create<A>
。该函数创建一个 A
类型的对象并调用它的 command
成员函数,打印您在屏幕上看到的输出。
启用优化意味着编译器发出具有相同可观察行为的东西。它可以发出与 int main() { printf("Cmd"); }
.