Older blog entries for redi (starting at number 221)

22 Jul 2010 (updated 22 Jul 2010 at 10:53 UTC) »
apenwarr's repeated suggestion for operator[]= is silly, that only helps types which have an operator[].

A better, more general solution is already in C++0x: Move Semantics. That removes performance overheads that copy elision (e.g. RVO) can't help with, in all sorts of situations, not just Avery's specific one for std::map.

And if you want the behaviour of python dictionaries, that's trivial:


template<typename Map, typename K>
typename Map::mapped_type&
get(Map& map, K&& key)
{
    auto pos = map.find(key);
    if (pos == map.end())
        throw std::runtime_error("Not found");
    return pos->second;
}

That works for anything with the same interface as std::map and allows get(m, 5) = "chicken" to work as you want, with no loss of efficiency*

The constructive criticism is valid, but years too late. C++0x has closures (which have zero overhead compared to a C function unless you need it, and can even be converted to C function pointers and passed to existing APIs,) it has typesafe varargs, and thanks to move semantics it can be significantly faster than C at copying data structures around, so there's no reason for functions to take out parameters by pointer/reference, just return them and watch the copies not happen. It also has type inference, and explicit conversion operators, which only convert when you want them to e.g. a smart pointer's conversion to bool happens if used in an if but not if you try to assign it to an int.

The bad parts of C++ may not have been removed, but some seriously good stuff has been added. (Edit: all of the above is available today in GCC.)

Oh, and exception handling is not too complicated. You must be doing it wrong.

* Actually a better version would use


typename Map::key_type key2(std::forward<K>(key));
map.find(key2);
for maximum efficiency in the case where K is not the same type as key_type and requires a conversion.
johnw writes But where Haskell needs Monads to make this type of thing reasonable and concise, C++ doesn’t. We get passing around of object state between function calls as part of the core language, and there are many different ways to express it.

I'm not sure that's necessarily a good thing. The hoops you have to jump through in Haskell to get stateful, sequential behaviour mean that it's a clear and conscious decision to do so, and you have a well-defined tool with which to reason about your program. In C++ that behaviour is hard to avoid, and might be incidental or even accidental, rather than explicit and desirable.

If you did have monads in your C++ program, they'd probably be leaky abstractions and it would be too easy to misuse them by combining them with "normal" code, so that you lose the benefit. In Haskell they are fenced off and harder to mis-apply (as I understand it, anyway.)

Also, the RVO doesn't rely on inlining, and there's no default construction or assignment operator in that example, MyObj x = ... is a constructor call not an assignment.

Sure RVO is a hack, but it's a safe and useful one (in many more situations than apenwarr's map case) so why do you care? Any why would anyone ever ever use C++ without an optimising compiler?! If you don't care enough about performance to use a decent compiler then why are you using C++ in the first place?

The only downside to the RVO (apart from the fact that the wikipedia article is incomplete and doesn't distinguish RVO and NRVO) is if you're relying on side effects of copy constructors, but that usually only happens in toy code people write to try and understand C++ rules.

My only other quibble is with the statement that you always know 'this' when you create a pointer-to-member-function. If that's how you use PMFs no wonder you don't find them useful ;)

8 Jul 2010 (updated 8 Jul 2010 at 00:42 UTC) »
If you love LLVM so much why don't you go live there?

I think it's healthy and important for a best-in-class software product to have serious competition from at least one other project (look what a stinking pile of slow Firefox has become - go Chrome!) and I can't begin to explain how highly I respect some of the developers working on clang++ and libc++.

But I get a teeny bit wound up by users who say "I haven't used Project X, but I hear it does Y and Z, and your project sucks because it doesn't do that!"

Really?

If it's so important to you, at least try it out, and if it actually does something differently, please let us know how we can improve.

But if you can't even be bothered to try it out, don't expect to be taken seriously.

8 Jun 2010 (updated 8 Jun 2010 at 10:30 UTC) »

Hey, Observers. If any of you are really interested in open source and are interested in this site for anything other than SEO opportunities, here are some ideas for mini-projects to improve Advogato:

  • Convert <h1>, <h2> etc. tags in syndicated diary entries to something sensible. I suggest simply <p>. Advogato diary entries are not allowed heading elements, so they get converted to &lt;h1&gt; and come out verbatim, not even on a new line (example)

  • Change the new account page where it says Attention spammers. I suspect SEO-scum do not consider themselves spammers and that they think their SEO-scum activities are acceptable behaviour. If the notice said Attention SEO workers it might get their attention. Now if only there was some way to find out where they live and send them a turd in a box ...

These should both be pretty easy and might earn you kudos from the users of this site. Even trying to do it would get you a certification from me. Get the code for mod_virgule (make sure you get StevenRainwater's new fork) and start hacking. I'd be happy to review patches or help you with any problems using subversion or building the code. Post (links to) patches in your diary or send them to robogato.

3 Jun 2010 (updated 3 Jun 2010 at 22:19 UTC) »

More than two years ago I said I was going to work on std::regex for libstdc++. I found a few bugs, but as the current implementation is skeletal and doesn't do anything I didn't bother checking most of my changes in. Nothing concrete came of that until a couple of weeks ago when I went back to it because I've been reviewing the Regular expressions library clause of the C++ Final Committee Draft. There are some implied preconditions which should be explicit, otherwise it's very easy to stray into nasal demon territory, which is pretty much guaranteed to format your hard drive and launch missiles. I need to write up a proposal to fix that, as well as undo the problems introduced to the definitions of Bitmask Types in the standard library. When I've done that I might actually apply my fixes to the skeletal regex code in libstdc++.

I'm also working on adding nullptr support to libstdc++, based on work done by Magnus Fromreide who added support for the new keyword to g++. I've recently made a couple of changes to g++ myself, improving some diagnostics that used non-standard terms such as "abstract functions" and "base initializers". I've also hacked g++ to warn about POD members which aren't initialised in the constructor's member initializer list, but that hack is far from production quality and might never get checked in.

I'm also supposed to be reviewing Scott Meyers' Overview of the New C++ (C++0x) for the ACCU Book Reviews. I haven't made much progress on that and might not make the next publication deadline for CVu. As you'd expect from Scott Meyers, it's erudite and clearly written and I recommend it to anyone interested in the new C++. It's also DRM-free, which is nice.

I don't know if the advogato diary entry form has changed or if it's because I'm now using Chromium on my netbook, but it's impossible to post more than 60 chars, which buggers up URLs.

the incredible notes from what may be my favourite advo-spammer ever:

I am a lawyer in my country united kingdom and my name is Scales Richard also 40 years old so i will happy in your welcome me in your site a friend of mine told me about the advogato site.

Thanks SOLICITOR SCALES RICHARD

I wish people wouldn't say something "throws" an error when exceptions are not involved. Shell scripts do not "throw" errors when they print out an error message, and neither do compilers when they reject your invalid code and print a diagnostic.

I'm at home with a cold so I've tackled a long-standing item on my TODO list and released PStreams 0.7.0, incorporating the spec file and a patch from the Fedora package. It's probably too late to make it into Fedora 13, but at some point the fedora package will be able to drop their patch and use my upstream version unaltered. Debian still uses an older release and I think I incorporated the diffs from their libpstreams-dev package a while ago. What's next?

wainstead, that egrep '^M' | awk '{ print $2 }' is poor grammar, it should be awk '/^M/{ print $2 }'

I would probably replace that loop with:

svn stat | awk '/^M/{ print "svn cat", $2, " | sdiff -w220 -", $2 }' | sh

212 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!