On 8/24/14, 6:16 AM, Dmitry Olshansky wrote:
24-Aug-2014 16:24, Andrei Alexandrescu пишет:
(Speaking of which: Some, but not all, types in std.container use
reference counting. One other great area of improvement would be to
guarantee that everything is std.container is reference counted.
Containers are the perfect candidate for reference counting - they are
typically large enough to make the reference counting overhead
negligible by comparison with the typical work on them.)


The rest of post is mostly in line with my reasoning (except for nobody
measures stuff, it's just bullshit).

Apologies for that, thanks for setting me straight.

Speaking of data-structures I find just about the opposite. Most data
structure are small, which must be the fact so fondly used by C++
vector: small-string optimization. Only very few data-structures are
large in a given program, and usually correspond to some global tables
and repositories. Others are either short lived byproduct of input
processing or are small data-sets attached to some global entity.

I don't know of any std::vector that uses the small string optimization. std::string does ubiquitously because (a) strings are often handled as values, and (b) C++11 put refcounted strings into illegality (forced mistake) therefore robbing implementers of an important optimization.

In a way both C++ and D got it "wrong". Arrays/containers are entity types - they have identity and should be manipulated most often by reference. Presence of pass-by-value of containers in C++ programs, save for rvalue optimization purposes, is suspicious. In contrast, strings are value types - they are handled most often as a unit and passed by value, just like e.g. numbers.

C++ made both containers and strings value types, so it needs forever to look over its shoulder about n00bs copying large containers unwittingly. It also does a fair amount of unneeded string copying, and optimizing string-based C++ code is nontrivial. D made both arrays and strings slices, a data structure made highly expressive by the garbage collector but that occasionally confuses people. With std.refcounted.RCString and std.container.Array we get both abstractions "right".


Andrei

Reply via email to