[Cython] Out of order side effects of argument evaluation in function calls (ticket #654)
stefan_ml at behnel.de
Fri Mar 11 18:36:47 CET 2011
Stefan Behnel, 11.03.2011 15:08:
> Vitja Makarov, 11.03.2011 15:04:
>> 2011/3/11 Stefan Behnel:
>>> Personally, I think it would be nice to keep up Python's semantics, but
>>> I implemented this I broke quite some code in Sage (you may have noticed
>>> that the sage-build project in Hudson has been red for a while). There are
>>> things in C and especially in C++ that cannot be easily copied into a
>>> temporary variable in order to make sure they are evaluated before the
>>> following arguments. This is not a problem for Python function calls where
>>> all arguments end up being copied (and often converted) anyway. It is a
>>> problem for C function calls, though.
>>> f(g(a), a.x, h(a))
>> Why could not this be translated into:
>> tmp1 = g(a)
>> tmp2 = a.x
>> tmp3 = h(a)
>> f(tmp1, tmp2, tmp3)
> See above.
To be a little clearer here, it's a problem in C for example with struct
values. Copying them by value into a temp variable can be expensive,
potentially twice as expensive as simply passing them into the function
Not sure what kind of additional devilry C++ provides here, but I'd expect
that object values can exhibit bizarre behaviour when being assigned. Maybe
others can enlighten me here.
I have no idea how many cases there actually are that we can't handle or
that may lead to a performance degradation when using temps, but the
problem is that they exist at all.
More information about the cython-devel