July 20, 2006

惡搞 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
迴響