>>it's existential for Qt to get off its own container classes. >>I shall in the future extend that statement to anything that overlaps >>with std.
Two points to keep in mind: 1) the std implementation varies with compiler vendors, each one with a different set of bugs, unit tests and sometimes performance. While with Qt, the implementation is more uniform. This to say, I feel more secure using Qt implementations for an application that runs on multiple platforms. And cross-platform is the core business of Qt... 2) a majority of Qt users are not C++ wizards, and ease of use / intuitive api, is of primary importance... std does not always shine here. Philippe On Fri, 01 Dec 2017 20:57:33 +0100 Marc Mutz <marc.m...@kdab.com> wrote: > On 2017-12-01 19:26, Thiago Macieira wrote: > > On Friday, 1 December 2017 01:31:18 PST Marc Mutz wrote: > >> > Once those operator<=> are there, what benefit is there in having the > >> > API > >> > public and documented? > >> > >> The spaceship operator solves the problem for qCompareStrings(). One > >> could say we already have all relational operators for all > >> combinations > >> of string-like objects to solve it for the user _now_, but > >> qCompareStrings(), like operator<=>() return the full information, > >> while > >> relational operators only return a subset. You know that, I know. I'm > >> just mentioning it for completeness sake. > > > > Ok, so your case is when you have two string-like objects and you want > > to get > > the ordering result. Since we don't yet have the spaceship operator, > > you have > > to call the compare() function. But you can't do that in clean, generic > > code > > because you don't know if the first argument is an actual QString or > > QStringView, or if it's just a char16_t literal. > > > > Is that it? > > > > Why can't they write > > > > QStringView(s1).compare(s2) ? > > I think you owe me a bit more thought on an answer to a mail of mine that > that :P > A quick look at the qCompareString() overload set will answer this question > (hint: the lhs is not always QStringView). > > >> Ah, but you said that the flaw was in the _standard_. But what you > >> show > >> are sub-optimal compiler implementations. There's nothing in the > >> standard that prevents a compiler to implement char_traits::length() > >> as > >> a compiler intrinsic that can have different backends for constexpr > >> and > >> runtime evaluation. > > > > The flaw is in the standard because it does not allow me to implement > > an > > optimised version using whichever tools I want to. > > The standard is not obliged to publicly give you all the plumbing to > re-implement the standard library. The lack of plumbing is _sometimes_ a flaw > in the standard, yes (std::invoke), but not always. You are supposed to use > the standard library functionality, not re-implement it. In this case, the > interface is char_traits::length, it exists on all supported platforms and > does what we'd like it to do, incl., from C++17 on, constexpr. > > >> So, would the following be acceptable: > >> > >> 1. QSV uses char_traits<char16_t>::length() to calculate the length > >> (that was my initial implementation, but it's constexpr only starting > >> with C++17). Then QSV(Char*) is only constexpr in C++17. I can live > >> with > >> that. > > > > No, because... > > > >> 2. You/Intel work on the compiler vendors to get > >> char_traits<char16_t>::length() implemented as an intrinsic, with SIMD > >> at runtime and compiler magic at compile-time? > > > > We should do that anyway, but depending on it means we'll have > > performance in > > 2021 or later (just look at how we have to build Linux binaries with > > GCC 4.8). > > Since char_traits::length would be called from inline code in QSV, its > performance does not depend on how Qt was compiled, but on what the user's > compiler is capable of. Also, presumably, the compiler was already optimizing > char_traits::length() back when it wasn't constexpr (in C++11+14) and now has > to implement something to not regress on runtime performance while still > meeting constexpr restrictions. If it doesn't, then it's not our problem. > It's SEP. And that is good. Pick your battles. > > > The flaw exists today. My choice for fixing it is to sacrifice the part > > we > > don't really need: the constexprness. > > Fixing it in Qt is limiting both Qt and the standard library. Don't do that. > > <rant> > The same is true, btw, of QMutex. Qt takes pride in how QMutex is faster than > std::mutex. I think it's a shame. It shows that you didn't go the next step > and get std::mutex fixed. Having QMutex not use std::mutex means that tsan > doesn't work correctly, for one. Here, too, the "easy" local "fix" is to the > detriment of both the standard library (slower-than-necessary mutex > operations) and Qt (failure to work with tsan). > > This habit of cocooning might have worked out ok when Qt was years ahead of > the C++ standard library. But since those times in the 2000s, C++ has > overtaken Qt in all aspects the committee decided to take on. Qt will have to > adapt to this new reality or degrade to insignificance. Ride the wave or > drown. > > As I said elsewhere: innovate, don't replicate. See the bigger picture here: > Where are the patches that integrate Qt's event system and signal/slots > mechanism with Coroutines, to name just one? Instead you celebrate the > perceived failures of the standard and Qt's ability to "fix" them by writing > a SIMD strlen or take the null state of a Qt value class to optimize > QOptional size. > > This pattern repeats and repeats. V8 fork, anyone? When will Qt _finally_ > learn? :) I said in my talks about QStringView that it's existential for Qt > to get off its own container classes. I shall in the future extend that > statement to anything that overlaps with std. > > I explicitly do not exclude QString here, even though it's exempt for the > time being. But people _do_ talk about a std::text_view, and it _will_ > support utf8 strings and that, in combination, _will_ degrade QString to > insignificance. > > When Coroutines and ASIO land in C++, C++ will magically gain a > cross-platform event loop. And more likely than not, you will have to > integrate with it using Coroutines, futures and other awaitables, not the > classic way of QAbstractEventDispatcher. It does not take a leap of > imagination to assume that Coroutines TS will spark a ton of reactive GUI > libraries for C++, incl. cross-platform ones. Qt needs to be prepared for > that day. And the only way to prepare is to start working on innovative stuff > and work with its various upstreams more, incl. the standard committee, and > innovate. Stop. Fixing. Stuff. Locally. Get. Involved. Don't. Kodak. Qt. > </rant> > > >> Then we fix the problem where it should be fixed, and just piggy-back > >> on > >> the more general solution. And it's easy to sell to QSV users why that > >> ctor is not constexpr until C++17 (and we don't even need any > >> #ifdefery > >> in the implementation). > >> > >> What do you think? > > > > We should fix the standard and we should help fix the implementations. > > But I'm > > not accepting a performance drawback for 3 or more years until then. > > Pick your battles. I offered a compromise. I think it's a good one. And I > think you're seriously overestimating the effect of your change. Not because > it doesn't give a large performance boost, when exercised (I'm sure it does), > but simply due to the fact that that code will be exercised very rarely. And, > when actually exercised, the smaller i-cache footprint of "my" function might > just beat "your" high-performance function in wall-clock time. Yes, in a > library, every missed optimisation is some user's performance bottleneck. But > we have an easy solution for that: people should be able to find in the > ctor's documentation the recommendation to use qustrlen() manually. > > Thanks, > Marc > > _______________________________________________ > Development mailing list > Development@qt-project.org > http://lists.qt-project.org/mailman/listinfo/development _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development