惡搞 C++
我很佩服那些熟悉 C++ Programming 的高手,之前的 blog [
用 C++ Template 算階層] 與 [
Awesome C++] 提到如何一「虧」C++ 之美,實在不是我這種平凡人可以想像的,美妙的 C++ Programming Language 對我來說,就如杜甫〈贈花卿〉所說:「此曲只應天上有,人間能得幾回聞!」。剛剛又作新的惡搞:
struct Foo {
Foo& operator() () { return *this; }
};
int main(void)
{
Foo foo;
((foo ()) ())()();
return 0;
}
乍看還有種 LISP 的風味呢,說是「惡搞」一點也沒錯,用 objdump 看一下:
$ objdump -S foo | grep -A23 main
080483c0 :
80483c0: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483c4: 83 e4 f0 and $0xfffffff0,%esp
80483c7: ff 71 fc pushl 0xfffffffc(%ecx)
80483ca: 55 push %ebp
80483cb: 89 e5 mov %esp,%ebp
80483cd: 51 push %ecx
80483ce: 83 ec 14 sub $0x14,%esp
80483d1: 8d 45 fb lea 0xfffffffb(%ebp),%eax
80483d4: 89 04 24 mov %eax,(%esp)
80483d7: e8 26 00 00 00 call 8048402 <_ZN3FooclEv>
80483dc: 89 04 24 mov %eax,(%esp)
80483df: e8 1e 00 00 00 call 8048402 <_ZN3FooclEv>
80483e4: 89 04 24 mov %eax,(%esp)
80483e7: e8 16 00 00 00 call 8048402 <_ZN3FooclEv>
80483ec: 89 04 24 mov %eax,(%esp)
80483ef: e8 0e 00 00 00 call 8048402 <_ZN3FooclEv>
80483f4: b8 00 00 00 00 mov $0x0,%eax
80483f9: 83 c4 14 add $0x14,%esp
80483fc: 59 pop %ecx
80483fd: 5d pop %ebp
80483fe: 8d 61 fc lea 0xfffffffc(%ecx),%esp
8048401: c3 ret
$ c++filt _ZN3FooclEv
Foo::operator()()
可以從產生的機械碼中看出 method invocation 的過程,有四次 operator() 的 invoking 動作,再多弄幾個 (),大概眼睛就花了。
由 jserv 發表於 July 20, 2006 02:31 PM