Memory allocation when using broadcasting macro @. with long expression?

It seems that if the expression is a bit long then @. allocates memory whereas manually using . does not. Why?
Here is an expression. No memory allocation if NOT including the last term within the brackets, but allocates if it is included.
@. f_Fe = 1.0/(1.0 + KFeCl*ClBW + KFeSO4*THSO4*f_SO4 + KFeCO3*TCO2*f_CO3 + KFeCO3OH*TCO2*f_CO3*KW/H + KFeHS*TH2S*f_HS + KFeS*TH2S*f_HS/H)
This does not allocate
f_Fe .= 1.0./(1.0 .+ KFeCl.*ClBW .+ KFeSO4.*THSO4.*f_SO4 .+ KFeCO3.*TCO2.*f_CO3 .+ KFeCO3OH.*TCO2.*f_CO3.*KW./H + KFeHS.*TH2S.*f_HS .+ KFeS.*TH2S.*f_HS./H)
Aren’t they supposed to be identical?
So is there a limit of the length of the expression?

The problem you’re running into is that Julia currently treats + as an n-ary operation, but gets mad when it is called with too many arguments. The short term fix is to add parentheses to break things up slightly.

1 Like

That works but it’s tricky to figure out where to put the brackets!

You can do

const ⊕ = +

and just use that instead of +

1 Like

what’s the theory behind that?

Then it no longer parses a n-ary.

1 Like

Cool. Thanks!