D10341: Allow move semantics to be generated for KFileItem. The existing copy constructor, destructor and copy assignment operator are now also generated by the compiler.

Mark Gaiser noreply at phabricator.kde.org
Wed Feb 7 23:34:27 UTC 2018


markg added a comment.


  In https://phabricator.kde.org/D10341#202704, @dfaure wrote:
  
  > I like the idea of enabling moves for KFileItem very much.
  >
  > But here's a fun fact: your unittest passes even without the rest of the patch.
  >
  >   PASS   : KFileItemTest::testMove()
  >   
  >
  > That's because std::move() doesn't move, it only makes the argument eligible for e.g. a move ctor, but will call a copy ctor if there's no move ctor. So that test is not really testing that move works ;)
  >  That's always a bit tricky to test, I guess, because one can't really rely on the state of the moved-from object to be anything in particular. And we want =default, not to implement some counters in there.
  >  Oh well, then maybe there's no real way to unittest that moving works.
  
  
  I know, i - somewhat - mentioned it ;)
  //"New test for move semantics (it passes, would probably pass without as well but just be a copy)."//
  
  The test might be rather pointless as is, but running that test though callgrind does show move semantics which is why i added it.
  Do i just remove it?
  
  > Anyhow, the thing I'm wondering is the following: does the rule-of-zero lead to more opportunities for optimizations by the compiler, who can see "from the outside" that the 5 special members are the default generated ones, while your patch "hides" the implementation, lowering the visibility for the compiler in the rest of the code? Well, one could just move the 5 "=default" to the header to fix that.
  
  There was an issue with that... I don't quite remember what it was. Let me try again... (to be continued)
  My preference is = default in the header.
  
  > Of course in both cases (rule-of-zero or 5*=default in the header), it means we are tied to the 5 defaults for all of KF5, for BIC reasons. But that seems rather sensible in this case (the only member will always be the d pointer, and it's unlikely we'll move away from refcounting...).
  >  And in fact the other reason against rule-of-zero is that we can't just remove the copy-ctor and operator=, that would be BIC (existing code links to it).
  
  Ha, i tried and found out :) (before posting it here). That's why i went for the = default version (rule-of-five-defaults) to prevent that BIC.
  
  > In summary: this looks good to me, I'm just wondering if inlining the 5 "=default" wouldn't be better, for optimization purposes.
  
  You know the real funny thing here? KFileItemList...
  It's a crappy QList with no move semantics.. I want to deprecate it (working on a patch for that now) by replacing it with a "using KFileItemListV2 = std::vector<KFileItem>" The biggest improvements can be made by having move semantics in KFileItemListV2. It would also deprecate a load of KIO functions that all expose KFileItemList (either as argument or as return value). The downside? Well, you probably guessed it already. A lot of deprecated warnings and current code that needs to stay working for the KF5 lifetime thus in the short term this might actually be a performance loss :( I'll post a patch for this soon for you to judge :)

REPOSITORY
  R241 KIO

REVISION DETAIL
  https://phabricator.kde.org/D10341

To: markg, dfaure, mwolff
Cc: ngraham, #frameworks, michaelh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-frameworks-devel/attachments/20180207/193dba74/attachment.html>


More information about the Kde-frameworks-devel mailing list