March 06, 2014 Re: xvalue and std::move in D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Edwin van Leeuwen | On 03/06/2014 03:21 AM, Edwin van Leeuwen wrote: > Lately in C++ I have become a fan of the type of functional programming > discussed here: > http://blog.knatten.org/2012/11/02/efficient-pure-functional-programming-in-c-using-move-semantics/ I haven't read that yet but I have always returned a vector from a function that produced it instead of adding to a reference parameter. > and was wondering if something similar is possible in D. Most of the time it is automatic and a non-issue for arrays. > Basically the idea is to define functions as follows: > > std::vector<double> add_to_vector( double x, std::vector<double> &&v ) { > v.push_back(x); > return v; > } Actually, when the name of the function is add_to_vector() anyway, there is an obvious side-effect. So, I would not return the result in C++. However, when the name is like make_vector() then I always return the result. The alternatives have many hard questions to answer: void make_vector(vector<double> & v) { // Should I clear v first? // Should I simply start appending to v? // etc. } All of the efficiency of doing that goes out the window when one considers exception safety. Anyway... Too much off topic... :) > Is this possible in D? T[] append(T)(T[] arr, T value) { arr ~= value; return arr; } Done. :) Slices consist of two members that are cheap to copy: The number of elements and the pointer to the first element. It is already as efficient as move in C++. You should also read the following article: http://dlang.org/d-array-article.html Ali |
Copyright © 1999-2021 by the D Language Foundation