This e-mail had a fatal bug! Anders::dance() obviously needs to be marked FINAL for the inlining to occur :-)
-Andreas On Jul 26, 2013, at 7:43 PM, Andreas Kling <akl...@apple.com> wrote: > Hi WebKittens! > > I’m about to re-land <http://webkit.org/b/115977> now that the OS X bots have > had their clang installations updated. > > Let me take a moment to explain what FINAL and OVERRIDE do, and how to apply > them. > > OVERRIDE is used to decorate virtual methods that override a method inherited > from a superclass. This makes the code slightly more self-documenting but > more importantly, gives us a compiler warning if there is no superclass > method with the same signature. In other words, OVERRIDE protects you from > forgetting to update subclasses when changing the signature of a method in a > superclass. > > Example of OVERRIDE: > > class Human { > public: > virtual void eat(); > }; > > class Anders : public Human { > public: > virtual void eat() OVERRIDE; > }; > > If you rename eat() to drink() in “B”, you’ll get a compiler warning: > huehuehue.cpp:8:15: error: 'drink' marked 'override' but does not override > any member functions > > FINAL is used to decorate overridden virtual methods that are known (at > compile time) to have no further subclass overrides. This allows the compiler > to optimize call sites that operate on specific-enough pointer types to avoid > the overhead of virtual dispatch. > > If a subclass is known to never have any subclasses, the whole class can be > marked FINAL, which is equivalent to making every overridden function in that > class FINAL. > > Example of FINAL: > > class Human { > public: > virtual void dance(); > }; > > class Swede : public Human { > public: > virtual void dance() OVERRIDE FINAL; > }; > > class Anders : public Swede { > public: > virtual void dance() OVERRIDE { /* No. */ } > }; > > This code will fail with the following error: > > teehee.cpp:15:18: error: declaration of ‘dance' overrides a 'final’ function > > In other words, if Anders really wants to dance differently from other > Swedes, you’ll have to remove the FINAL from Swede::dance(). > > What happens when we tell Anders to dance? > > Human* man = getHuman(); > man->dance(); // Virtual function call > > Anders* ders = getAnders(); > ders->dance(); // Inlined! > > Because the compiler knows that “ders” is of type Anders, it doesn’t have to > do a virtual function call, but can just inline the dance() implementation > (or lack thereof) right there. > > Pretty cool right? Giving the compiler this information means that it can > generate smaller and faster code wherever we are using tighter pointer types. > > Anyways, that’s pretty much it. > > -Andreas > > PS. Making a whole class FINAL looks like this: > > class Countdown FINAL : public SwedishObject { > > _______________________________________________ > webkit-dev mailing list > webkit-dev@lists.webkit.org > https://lists.webkit.org/mailman/listinfo/webkit-dev
_______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-dev