i’m also curious as to whether this would be faster as a member function on the 
struct itself, since member functions get `self` as a pointer, right?

> On May 7, 2017, at 11:21 AM, Kelvin Ma <kelvin1...@gmail.com> wrote:
> 
> So if I am passing the large struct to a large function, or a function that 
> lives in a different module (as my project is currently split into 8 or 9 
> modules — is that too many?), am I better off passing the members 
> individually instead of passing the entire struct? It seems kind of tedious 
> to have to write 
> 
> func f(x:Double, y:Double) -> Double 
> {
>     ....
> }
> 
> let z:Double = f(x: point.x, y: point.y) 
> 
> instead, and it seems like something the compiler ought to be responsible for.
> 
> Also about boxing the struct, isn’t that the worst of both worlds? You get 
> the overhead of pass-by-value, the overhead of reference counting, the heap 
> allocation, and the heap access. Plus it’s a lot of work to manually 
> implement copy on write, and the copy is decided at runtime, even when it is 
> known that an object will or won’t be mutated at compile time. 
> 
>> On Sun, May 7, 2017 at 12:43 AM, Daniel Dunbar <daniel_dun...@apple.com> 
>> wrote:
>> 
>>>> On May 6, 2017, at 10:39 PM, Brent Royal-Gordon <br...@architechies.com> 
>>>> wrote:
>>>> 
>>>> On May 6, 2017, at 10:34 PM, Daniel Dunbar via swift-users 
>>>> <swift-users@swift.org> wrote:
>>>> 
>>>> To answer Kelvin's question, yes, the optimizer will be able to see 
>>>> through that code _assuming_ it can see the definition in a way it can 
>>>> optimize
>>> 
>>> 
>>> Kelvin, you should definitely take Daniel's word over mine on whether 
>>> there's an optimization for this. I believe the rest of my explanation is 
>>> correct.
>> 
>> Actually I think yours was more accurate... while it is is true the desired 
>> optimization will often take effect (given the conditions I describe), 
>> your's was correct that this isn't happening because the function signature 
>> is taking _fewer_ arguments. Rather, the optimizations works because the 
>> compiler will tend to inline that small function and then see it can discard 
>> the unnecessary data.
>> 
>> Whether or not this makes it worth boxing your struct to avoid large copies 
>> probably depends on how much you need to pass the struct through call sites 
>> which would in fact need to copy the full struct, versus inlining down to 
>> something smaller.
>> 
>> HTH,
>>  - Daniel
>> 
>>> 
>>> -- 
>>> Brent Royal-Gordon
>>> Architechies
>>> 
>> 
> 
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to