On Wed, Aug 8, 2012 at 3:29 AM, Miles Bader <mi...@gnu.org> wrote: > Richard Guenther <richard.guent...@gmail.com> writes: >>>>> Constructors are allowed, but PODs are often passed more efficiently. >>>>> That property seemed particularly important for double_int. >>>> >>>> Show us the difference in timing. Show us the generated code. I >>>> can't imagine that it could ever matter. >>> >>> I'm also curious about that statement... PODs don't really seem to >>> offer much advantage with modern compilers, except in a few very >>> specific cases (of which this doesn't seem to be one), e.g. in unions. >> >> They make a difference for the by-value passing ABI. double-ints can >> be passed in two registers on most platforms. > > Sure, but that doesn't seem to depend on PODness -- non-PODs can be > passed in two registers as well, AFAICS... > > E.g., in the following: > > typedef long valtype; > > struct X { valtype x, y; }; > struct Y { Y (valtype a, valtype b) : x (a), y (b) { } valtype x, y; }; > > extern void fx (X x); > void test_x () {X x = { 1, 2 }; fx (x); } > > extern void fy (Y y); > void test_y () {Y y (1, 2); fy (y); } > > test_x and test_y use exactly the same calling sequence (and contain > exactly the same assembly code)... [on x86-64]
It is not PODness in the standard sense that matters. It is podness from the ABI perspecitve: Y does not have a user-defined copy-constructor nor a desctructor; it is not a polymorphic type, so it is OK to pass in registers just like X. -- Gaby