
Sebastian Redl wrote:
Joel de Guzman wrote:
Gennadiy Rozental wrote:
It's possible. Still there code size will be significantly bigger in comparison with offline implementation, right?
Fusion vector, for example is as fast as a struct. But Gennadiy is talking about code size, not execution speed. The very fact that makes Fusion so fast, its ability to compile down to code that looks like it was specifically written for the case at hand, means that every usage will have almost exactly the same code, but slightly different - as if it was written specifically for each case by hand.
Ok, let's see... for_each(x, f) generates: f(x.m1) f(x.m2) f(x.m3) f(x.m4) ... then: for_each(y, f) which gives: f(y.m1) f(y.m2) f(y.m3) f(y.m4) ... so where is the overhead? It's as minimal as it can be. It can't be any better than that. Duplication of code? Of course! There's no way around that given the polymorphic nature of 'f'. Even variant would generate these code. Now... std::for_each(x, f) // x is a variant std::for_each(y, f) // y is a variant in addition to what fusion does (zero overhead), the variant code will also have to emit some switch code to dispatch to the correct 'f' (visitor) overload. .......... Really, this is all very wasteful of time. When in doubt, profile, test! See the assembler. If you think variant can be as optimal as fusion, be my guest, profile the code and examine the assembler results (in terms of code size *and* speed). Regards, -- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net