C++: The Documentary
Posted by ingve 5 days ago
Comments
Comment by mirmor23 4 days ago
IMO, if c++/cfront didn't ride on the tails of c, I'm skeptical it would've seen widespread use, but then, that's its main identity which limited it in ways that C++ was not willing to change; It is highly irritating to spend as much time to sanitize the implementation with Coverity/Valgrind and the ilk when the compiler could've handled it.
With C++98, Bjarne's book on c++ internals could've give you good insight into what went on, but later it turned into a whole cottage industry of "effective, more effective, proficient, performant, c++" series of books -- so kiss goodbye to any notion of being able comprehend existing code that's not written by you (until llms arrived). I'm happy to have spent time to learn problem domain instead.
I'll still watch the documentary since it has some of my favorite folks (Kernighan, Stepanov).
Comment by WalterBright 4 days ago
What launched C++ into success was Zortech C++. At the time, 90% of programming was done on MS-DOS. Cfront was nearly unusable on DOS, because:
1. agonizingly slow to compile
2. no support for near/far pointers, which was essential for non-trivial apps
Zortech C++ fixed those problems, and sold like wildfire. This provided critical mass for C++ to succeed. The traffic on comp.lang.c++ angled sharply upward. Borland saw our sales, and abandoned their OOP language product and did Turbo C++ instead. Microsoft saw Borland's success and then did their own C++.
We sold a lot of Zortech C++ compilers to Microsoft. They used it to develop COM.
I heard rumors that Microsoft was developing their own OOP C, called C*. I've never been able to confirm it, though.
Comment by wasmperson 4 days ago
Comment by WalterBright 4 days ago
Nope. As I mentioned, Borland was working on their own OOP C language. ZTC++'s success caused them to abandon it and do Turbo C++. I know this because of my conversations with Eugene Wang. And Turbo C++'s success caused Microsoft to do MSVC++, which was quite late to the game.
Before C++, the newsgroup traffic on C++ and ObjC was about the same. The C++ traffic took off after ZTC++ was released.
Comment by WalterBright 4 days ago
1. looking at newsgroup programming language traffic over time
2. looking at the release dates of Zortech C++, Turbo C++, and MSVC++
3. looking at the programming magazines of the time and what language/compiler they used
4. looking at the programming magazines at the time and seeing they were all about programming on the PC, not mainframes, and not Unix.
Comment by WalterBright 4 days ago
1. do I need a license to create a C++ compiler?
2. do I need to call it something other than C++?
He laughed and said, no, I could do whatever I wanted. He also thanked me for being the only compiler guy to ask permission.
I read about his passing a few years ago. He was a solid guy.
Comment by WalterBright 4 days ago
Comment by andrewl-hn 4 days ago
Comment by Maxatar 4 days ago
Comment by CyberDildonics 4 days ago
Niche experiments having features doesn't accomplish anything, but adding just one more feature to C seems plausible.
With C++ people could point people to another production ready language compatible with C that people could use, so there was somewhere they could do and an example of the feature working instead of someone promising silver bullets in theory.
Comment by WalterBright 4 days ago
I thought it would be a couple months to add C++ to my C compiler. 10 years later...
Comment by WalterBright 4 days ago
Perhaps. But in the 80's, C was the most practical language to use on the PC, by far. And porting C code to other platforms was easy.
Comment by deaddodo 4 days ago
Comment by foobar1274278 4 days ago
From the essay:
"Unix and C are the ultimate computer viruses.
A further benefit of the worse-is-better philosophy is that the programmer is conditioned to sacrifice some safety, convenience, and hassle to get good performance and modest resource use. Programs written using the New Jersey approach will work well both in small machines and large ones, and the code will be portable because it is written on top of a virus.
It is important to remember that the initial virus has to be basically good. If so, the viral spread is assured as long as it is portable. Once the virus has spread, there will be pressure to improve it, possibly by increasing its functionality closer to 90%, but users have already been conditioned to accept worse than the right thing. Therefore, the worse-is-better software first will gain acceptance, second will condition its users to expect less, and third will be improved to a point that is almost the right thing. In concrete terms, even though Lisp compilers in 1987 were about as good as C compilers, there are many more compiler experts who want to make C compilers better than want to make Lisp compilers better.
The good news is that in 1995 we will have a good operating system and programming language; the bad news is that they will be Unix and C++."
Comment by 0xpgm 4 days ago
Their creation C and UNIX won over the more advanced LISP and Smalltalk systems because they were simpler to implement. Even their own more advanced Plan 9 based OSs could not displace the more widespread unix-like systems.
It seems distribution and 'good enough' to rely on always wins. IMO, dynamic languages like Perl, Python, Ruby, JavaScript, PHP and the heavily marketed Java provided good enough high level facilities that have prevented people from reaching for Lisp and Smalltalk.
Looking at it through this lens, perhaps C++ was the vehicle for strapping some high level facilities on a widely adopted low level performant language that made it just good enough of a technology for wide adoption.
Comment by doug_durham 4 days ago
Comment by skydhash 4 days ago
Comment by igouy 4 days ago
Comment by doug_durham 4 days ago
Comment by 0xpgm 4 days ago
And they became just good enough that more people didn't go into Lisp/Smalltalk instead.
Comment by 72deluxe 4 days ago
Comment by jmalicki 4 days ago
It's why I've found Rust a joy - enough had happened in programming languages, that it was able to reinvent C++ with some of the best parts of the Haskell/ML/Scala family, some of the ergonomics of Python/nodejs, and bringing the borrow checker too.
C++ is this weird amalgam of like 7 different generations of languages.
But by far the worst part is the developer hostility behind the idea of UB. "Oh, this is not an error, it will compile, we will just secretly stab you in the back."
You can get good and avoid it, and there are tools to help you, but why is that at all a reasonable stance for the definition of a language?
Comment by jeffbee 4 days ago
Comment by bdelmas 4 days ago
Now for Rust I don’t think it is going to change a lot. Because it is based on ML, it has the best foundations and all features are known. The question is more how much Haskell vs script/imperative do you want your language to be, and what’s the purpose of the language rather than we had the wrong paradigm and found a new better one. For Rust 99% of its features are known and most are already implemented.
Maybe things around the borrow checker, and await, but beyond that nothing as much as what C++ saw in its history. Even more when for instance you see the article from the guy doing Gleam where traits (impl) are not necessary, all you need is data and function to have the same functionality. Or how ML have been the main factor to most new languages or new features to existing languages.
The future is ML, with languages dedicated to specific use cases and niches. And also ML languages easily readable by AI.
Comment by jmalicki 4 days ago
After 3-4 years, sure. But eventually enough has changed it's worth redoing.
Comment by xedrac 4 days ago
Comment by msla 4 days ago
Obviously. C++ was a "better C" in that you could keep a lot of your "legacy" C code while improving your codebase piecemeal with C++ features. Your management didn't even have to care, in that C/C++ was accepted as a valid descriptor even by people who should have known better. It's a wonder Java/C# and Perl/PHP never caught on.
Comment by pjmlp 2 days ago
Comment by aozgaa 4 days ago
In my experience it takes a while (<=3 months) for folks to become proficient when they see an alien dialect of c++. That may sound totally unacceptable to you (fair). Cpp is also a “big tent” language in that it is genuinely multi-paradigm.
I think LLM’s might help, but sometime they hurt too (confidently/persuasively wrong analyses). The gain is large for small/trivial contributions. For changes that require genuine understanding, I’m not sure (large error bars personally as to whether the sign is even positive).
Comment by pjmlp 4 days ago
Followed a couple of years later contribution to Go's design, exactly to avoid C++ at Google.
Comment by zeroc8 4 days ago
Comment by paulddraper 4 days ago
Comment by bdamm 5 days ago
Comment by zeafoamrun 5 days ago
Comment by tonyedgecombe 5 days ago
Comment by abcd_f 4 days ago
... as it is disappointing.
Not everything that can be done should be done.
Comment by stackghost 4 days ago
Comment by wavemode 4 days ago
If that's an incremental build though (i.e. simply rebuilding after changing a few files), there's something very wrong.
Comment by bdamm 4 days ago
Comment by GodelNumbering 5 days ago
Comment by kibwen 4 days ago
Comment by frollogaston 4 days ago
Comment by kibwen 4 days ago
Comment by GodelNumbering 4 days ago
Comment by tourist2d 4 days ago
Comment by dbdr 4 days ago
I would say the same thing of Rust.
Comment by dysoco 4 days ago
Comment by snuxoll 4 days ago
Comment by dbdr 4 days ago
The only downside is that unsafe rust is more verbose than C/C++.
Comment by markus_zhang 4 days ago
Comment by turkeyboi 4 days ago
Comment by tenderfault 5 days ago
Comment by usefulcat 4 days ago
Comment by ergonaught 4 days ago
Comment by ahartmetz 4 days ago
Comment by W0lf 5 days ago
Comment by tenderfault 5 days ago
2. Meet your hero
3. Start an awkward conversation with your hero.
It always goes like this no matter what you try.
Comment by hcrisp 4 days ago
Comment by cyberax 4 days ago
But it was indeed a nice book that really made stataic polymorphism popular. Before that, most books focused on building object hierarchies with virtual functions, etc.
Comment by mwigdahl 4 days ago
Comment by lepicz 4 days ago
the only thing i was regularly using (Loki library) for was the assoc_vector
Comment by pjmlp 4 days ago
Comment by TonyAlicea10 4 days ago
Web devs are just users playing in a C++ dev’s program. ;)
Comment by criddell 4 days ago
For the language of the web I'd probably nominate HTML.
For the language of the internet it's a lot less clear to me.
Comment by TonyAlicea10 4 days ago
Comment by irishcoffee 4 days ago
Comment by ahartmetz 4 days ago
In any case, Rust is basically C++ 2.0 to me because it is very much in the spirit of C++.
Comment by pjmlp 2 days ago
It is kind of ironic that Rust will outlive Firefox as Mozzilla's legacy.
Comment by TonyAlicea10 3 days ago
Comment by ivanjermakov 4 days ago
Comment by Brian_K_White 4 days ago
A C++ compiler outputs machine code that runs on a raw cpu if you want it to. The os providing a virtual cpu is just an optional extra and so irrelevant.
That is not true for someone writing php or js or anything that runs in an interpreter. C/OS/Kernel are not actually the interpreter for C++, or they are, but only in the same way that the bare hardware is. C++ is the final interpeter layer besides assembly.
Comment by ivanjermakov 3 days ago
Comment by tempodox 3 days ago
Comment by coffeeaddict1 4 days ago
Comment by spacechild1 4 days ago
Comment by socalgal2 4 days ago
Comment by bulbar 4 days ago
Comment by lostdog 4 days ago
It took in almost every idea, and the battlefield showed us which do work and which don't. We get to keep RAII, move vs copy, smart pointers, placement-new, and generics. We get to drop auto_ptr, copy-by-default, its specific exceptions implementation (fight me), multiple virtual inheritance, and templates as full code substitution.
In my opinion the battles have played out, and Rust is the best sum-up of what worked (it even inherited the compile times! Lucky us!)
Comment by jdw64 5 days ago
When a game or program is made with C++, it's usually nice because performance is mostly guaranteed. But if someone told me to write C++ myself, I'd cry. There's too much to memorize, and the standards are too varied. When I go to a project site for maintenance and it's a C++ project, I instantly lose energy — because it's just too difficult.
I'd be happy if someone else wrote it, but it's not a language I want to write myself
Comment by bayindirh 5 days ago
I have to go through the same warm-up more or less for any language I work with, so it's not that different than writing Python, Go or Java for me.
Comment by whstl 5 days ago
There's basically dozens of very nice languages inside C++. That can be a blessing or a curse.
I'm anxious for Herb Sutter's CPP2/CPPFront to become a standard.
Comment by tialaramex 5 days ago
Comment by whstl 4 days ago
Comment by Mond_ 4 days ago
Tbh I never expected that experiment to go anywhere. I guess that leaves Carbon (and large scale efforts to rewrite C++ in Rust).
Comment by whstl 4 days ago
Comment by domenicd 5 days ago
Comment by bluGill 4 days ago
Comment by maccard 4 days ago
Comment by pjmlp 4 days ago
Comment by maccard 4 days ago
Comment by pjmlp 3 days ago
Whereas one kind of works (VS), there is apparently no work going on VSCode Intelisense, ticket is stalled since January, and the promised announcement never came up.
Comment by bluGill 4 days ago
Nobody has said they are using them in anything important, but hopefully that is coming.
Comment by Maxatar 4 days ago
Comment by bluGill 4 days ago
Comment by maccard 4 days ago
Comment by buovjaga 4 days ago
Comment by bulbar 4 days ago
Comment by whstl 4 days ago
Chromium is gonna be more conservative than that for sure.
Comment by avadodin 5 days ago
Comment by drysine 4 days ago
Why? It doesn't remove complexity, it (partially) hides it and makes the whole thing even more complex.
Comment by whstl 4 days ago
Comment by rustyhancock 5 days ago
You don't learn or know C++ in the way you learn or know C.
You never have the total language spec in mind. Much of it you will never (and for some of it should never) come across.
The way I think of it
C is an abstraction of the machine, so thin it's nearly transparent.
C++ is an abstraction over programming paradigms, letting you pick how you think.
Everything else abstracts the machine away, replacing it with a VM, runtime, or model of its own.
The same way a good project has a clear model of the problem it should have a clear C++ pattern in use.
Comment by minipci1321 4 days ago
-Werror might help with that
Comment by techbrovanguard 4 days ago
Looks like someone fell for the C abstract machine trap yet again. No, C is isn’t an abstraction of the machine.
Comment by poncho_romero 4 days ago
Comment by bayindirh 4 days ago
Comment by skydhash 4 days ago
Comment by rustyhancock 4 days ago
I couldn't do that with mciropython on any platform.
C is a thin abstraction, python isn't.
Comment by pjmlp 2 days ago
Comment by nicebyte 4 days ago
Comment by jdw64 5 days ago
Comment by bayindirh 5 days ago
Then I design the thing I want to build. I always design what I want to build beforehand. This takes a couple of iterations from high level to low-ish level. That last design becomes a bit language dependent. Then I select some of the core tools that I'm going to use (which kind of pointers, classes or structs, etc.)
With that design in mind, I go "library shopping" both for file formats (if any) or other stuff like vectors, etc.
Armed with the reference docs of these, I write my code with the toolbelt I have built for the project.
Some things are hard, but they are not impossible. I find thinking like compiler helps a lot.
Comment by maccard 5 days ago
The varying standards are no different to major python versions or go versions - arguably there’s even less between most versions than there is in your average go release.
The differences in apps and frameworks don’t matter for day to day - std::string, Unreal’s FString and QT’s QString all are similar enough that 99.9% of the time.
Metaprogramming is one of those things; you either write it or you don’t. Knowing some basics is required but the vast majority of people use a handful of pre existing things without understanding the nuances of how it works under the hood.
Comment by tralarpa 4 days ago
Is it? Java has changed a lot, but in such a way that it's still easy to mentally map new features to the old ones, provided you have understood the core language. IDEs can even convert your code from old to new and back.
Comment by xonre 4 days ago
Template meta-programming maps to C pre-processor macros. The sad part with both is generated code cannot be examined thus the unreadable compiler errors and slower compilation as it's regenerated every time.
Slightly off-topic: Rust can also be mentally mapped to C.
Comment by maccard 4 days ago
On the c++ side, “modern” features like span, smart pointers, range based for loops, format are all really simple to reason back to for anyone who is a programmer. Stuff like modules and concepts is a bit different, but most people aren’t in the innards of those every day, in the same way that the change in header size doesn’t affect every single Java developers code, but you should know about it.
Comment by flohofwoe 5 days ago
It's not a new feature. And tbh, compared to Typescript, C++ templates are tame ;)
(but yeah, deciding when to stop digging into the template metaprogramming rabbit hole requires some common sense and sanity, too much template complexity is almost never worth the hassle)
Comment by bregma 4 days ago
Comment by justin66 4 days ago
Unreal Engine depends on C++20 at this point.
https://dev.epicgames.com/documentation/unreal-engine/epic-c...
Comment by jdw64 4 days ago
Comment by xedrac 4 days ago
Comment by bayindirh 4 days ago
This coupled with generous amount of Valgrind testing allows me to catch problems early and fix them immediately. Doing this allowed me to write very performant code without any leaks or accuracy problems.
Another thing I do is making some cases mathematically impossible. If this promise is broken, code is guaranteed to crash at that point, so it’s self verifying in a sense.
Of course enforcement of this is possible due to fact that I code solo most of the time, and has the discipline to do boring things as well as the exciting and fun things.
Comment by Brian_K_White 4 days ago
That's the easy half.
The old joke used to be that perl is a write-only language. Hell the way I write bash is pretty write-only (basically golf). I'd say so is C++.
A lot of things are easy to write and then impossible to read or develop.
Comment by lelanthran 5 days ago
How is that different from other languages, which don't need the brain warm-up?
Comment by bayindirh 5 days ago
Otherwise it's not different for me. I don't feel different while writing with any other language. I guess the main reason is I always think like the computer first and translate that thinking to the programming language at hand.
Comment by flohofwoe 5 days ago
Related, the main problem with the C++ ecosystem is that everybody carves out their own language subset, so it's not one ecosystem but many ecosystems with contradicting styles and language/stdlib subsets. This makes code reuse via libraries much harder than it should be.
[0] https://hftuniversity.com/post/the-c-standard-library-has-be...
Comment by jibal 4 days ago
People love to rag on the standards committee. I was on X3J11, the C Language Standards Committee, in 1989 ... in fact, due to alphabetical order I was the first person on the planet to vote to approve the C language standard -- the one that first standardized register and trigraphs. Standards work is hard and everyone hates you for it.
Comment by flohofwoe 4 days ago
Comment by pjmlp 4 days ago
Or _Keywords with an additional header file?
Maybe something_ names as proper namespaces are too hard?
One could mention better testing before adding features to the standards, but then C99 VLAs happened.
Comment by herr_shield 5 days ago
Once you get rid of the STL, compile times get so much better. With modern c++23 features, templates actually become really convenient to write, and at the core there is a really useful and pleasant to use language.
I try to avoid c++ libraries and instead rely on c-style APIs. Usually the c++ style libraries force you into using the STL, which comes with a heavy tax on compile times, without much benefit in comfort of use.
Comment by GnarfGnarf 4 days ago
Comment by spwa4 4 days ago
Comment by wavemode 4 days ago
I echo the parent commenter - the STL has a massive negative impact on compile times. And for what? The STL is not even fast. The way the standards are written, std::unordered_map has to be implemented as a tree rather than a flat open-addressing hashtable, which would've been far superior due to cache locality.
For my own project I rolled my own string, string_view, map, set, optional, variant, and vector. Only took maybe a day. And that day has paid dividends, as my clean debug builds literally take 3 seconds now.
Comment by drivebyhooting 4 days ago
Comment by samiv 5 days ago
Comment by flohofwoe 5 days ago
On the contrary. You can focus exactly on the features the higher level game code needs. The C++ stdlib is (for the most part) poorly designed, usually poorly implemented, the main reason for slow build times, and its complexity explodes because it needs to consider all edge cases that most code bases don't ever trigger.
A specialized dynamic array class in a few hundred lines (at most!) and with just the required features is much more useful than the 20kloc monster that's pulled in with `#include <vector>` and which doesn't even do bounds checking in the 'idiomatic' usage.
Comment by Chaosvex 5 days ago
You complain about it not being suitable for game development in one comment but then expect bounds checking in release builds? You're sitting in multiple lanes at the same time.
NIH implementations are usually grossly inferior because as it turns out, it's quite hard to get it right and those edge-cases aren't important until you start getting bitten by them when you'd rather be shipping features.
Comment by flohofwoe 5 days ago
Bounds checking overhead is negligible for all but the absolutely hottest code paths (fwiw we shipped active asserts, including bounds checking asserts in all the PC games I was involved with - carefully monitoring the overhead of course).
The main reason to not use the stdlib isn't so much about squeezing out the last bit of performance, but about control of what actually happens under the hood (and also compilation times). The overall runtime cost of all those active asserts (not just the range checks, everything) was somewhere in the 2..3% range, which is fine when budgeted for upfront.
Comment by Chaosvex 5 days ago
Comment by imtringued 4 days ago
I personally am more conservative on those things. I'll pick the fastest thing that is reliable.
Comment by bluGill 4 days ago
Comment by jason_oster 4 days ago
Comment by tarnith 4 days ago
We can all agree it's not medical systems, but audio DSP and game dev both end up rewriting a lot of STL stuff to suit their needs, and often using a restricted subset of modern C++ features for similar reasons.
That isn't some arbitrary choice, but pretty much where everyone continually ends up when solving real-time problems using C++. Whether those be games or not.
Comment by bluGill 4 days ago
Comment by flohofwoe 4 days ago
The reason to keep asserts in release mode is so that when one of those asserts is triggered "out in the wild" the bug investigation is dramatically simplified. The assert message and callstack is usually enough to figure out what went wrong. With a regular crash that happens without asserts the actual reason of the crash may already be obfuscated enough that a useful bug diagnosis is no longer possible. E.g. an assert is usually triggered very close to the bug, while crashes are usually only the end result of a whole cascade of events triggered by an initial bug.
Comment by bluGill 3 days ago
And this is why games are different from medical devices. In medical devices, I would worry anyway. In games, especially in a tight loop, it may be that extra CPU instruction is an important difference in performance.
Comment by moomin 4 days ago
Comment by criddell 4 days ago
For example, both of these return the 3rd element of a std::vector:
auto val1 = vec[3]; // no bounds checking
auto val2 = vec.at(3); // bounds checkingComment by Mond_ 4 days ago
Comment by samiv 5 days ago
Comment by bluGill 4 days ago
Most of the rest of us STL is good enough.
Comment by tarnith 4 days ago
Not uncommon for audio companies to also write their own containers and internal STL for ex. plugins as well.
Comment by demorro 5 days ago
Yes, it can exhibit non-optimal performance, and in some specific cases (regex's especially), extremely poor performance, but that's not the same as being poorly designed and implemented, especially given the breadth of the thing.
Comment by lenkite 4 days ago
The ABI Nightmare - The C++ committee has this extraordinarily weird and strict rule: never break the Application Binary Interface (ABI). If a better algorithm or memory layout is discovered, the standard library cannot adopt it because doing so would change object layouts and break existing binaries. The worst part is that this ABI is never defined, so you always HEAVILY pay for what you DON'T use.
std::regex - the Programming Language Joke of the millennium. Even an interpreted language regex engine runs faster.
std::map, std::unordered_map - outdated, badly-designed and slow crap that is beaten even by high-school coders writing map data-structures.
No bounds checking. And Undefined Behavior by Default for operators like std::vector::operator[]
std::iostream - bloated, expensive design, std::vector<bool> - another joke.
Silent Iterator Invalidations causing unpredictable memory corruption.
No deprecation strategy. There are FOUR callable wrappers. At-least, have the courage to say @DEPRECATED.
No Standard Networking.
Missing System Utilities - nothing for process management, standard cryptography, or basic command-line argument parsing, etc.
To be honest, this is just the common complaints - if you run through all the stdlib features, there are dozens of severe problems. Which all the smart people know about, but are forbidden to fix - because of ABI!
Comment by pjmlp 5 days ago
Comment by mixolydianagain 5 days ago
Comment by spacechild1 5 days ago
Comment by ahartmetz 4 days ago
Comment by variadix 4 days ago
Comment by VoidWarranty 5 days ago
Comment by leonidasrup 5 days ago
Comment by tialaramex 4 days ago
1. Stepanov's generic programming is a good idea. Every language you've seen with "generics" that's his idea, to the extent "The STL" is generic programming, everybody agreed it's a good idea.
2. But the STL is very old now, so while the idea is good, this is one of the oldest (Stepanov had tried this in other languages before C++) implementations and so other implementations are often better, because they've learned from experience
3. As well as pretty good generic algorithms, the STL also provides a lot of container types (what Rust would call collection types) and these vary not between "excellent" and "mediocre" but between "mediocre" and "inexplicably terrifying". The most charitable explanation is that they're just intended for teaching. If you teach DS&A to a Computer Science class you want the Extrusive Doubly Linked List to teach in class. If you write software you almost certainly never need this type, but it's front an centre in the C++ STL.
There's a single "I guess I would use this" container type, std::vector. It has an insane special case for bool, because WG21 are idiots, but it's otherwise a good enough growable array type and it's not worth building your own instead given the constraints.
Everything else is silly, or bad, or both. std::unordered_map feels like a hash table I made in class in the mid 1990s, but it's actually the provided standard hash table container in C++ 11 onwards. std::list is just that extrusive linked list for some insane reason. The Microsoft standard library maintainer STL could not offer me any justification for what std::deque is actually supposed to be for.
Comment by bernds74 4 days ago
Case in point: list::sort. You don't want to try running quicksort on a linked list. Or remove_if: great we've abstracted the difficult task of removing things without erasing them, except we can't do it on maps. (C++20 seems to add an erase_if, apparently admitting that the two-step remove/erase is silly).
Then there's the fact that C++ iterators are basically pointers into the data structure, where for vectors (your common case) you'd do much better with index/container pairs, both for stability and bounds checking.
Comment by SJC_Hacker 4 days ago
STD::sort only works on a random access iterator, it won’t even compile if you try it on a list
Comment by einpoklum 4 days ago
About that one... I would claim that in a majority of cases where an std::vector is used, what the author really wanted was a similar type, but whose size and capacity are fixed on construction and never change. The standard C++ library does not offer such a type - so people use vector because it's handy.
Agree with your takes on most of the containers. I also dislike how optionals are never used with containers as they were standardized later (and even then, problematically w.r.t. references). Thus, for example, if I lookup an object in a map of T's, the result should IMNSHO be an optional reference to a T.
Comment by Joker_vD 4 days ago
There is std::array for that. Also, for a type with fixed capacity but variable (up to that capacity) size, we're getting std::inplace_vector soon™.
Comment by einpoklum 4 days ago
Comment by SJC_Hacker 4 days ago
If you want to get f cy you can also give it a custam allocator and throw an exception if you do this by mistake
Comment by einpoklum 3 days ago
But that's the point. You _can_ push_back, or resize, or reserve, etc. etc. My claim is that the more common use case is the one where this _cannot_ happen.
> If you want to get f cy you can also give it a custam allocator
And then nobody will want to use it, because that's not interchangeable with containers vector with the default allocator, and also difficult to understand. I mean, look at PMR allocators, which are not even that custom. They see very little use I'm afraid.
Comment by Joker_vD 3 days ago
Also, do I understand correctly that you want both the capacity and the size fixed, i.e., the container's elements have to be pre-constructed and supplied to the constructor via an initializer list?
Comment by afdbcreid 4 days ago
Comment by einpoklum 4 days ago
* APIs/function signatures explain more clearly what are the intended uses of the structure that's passed.
* More potential for compiler optimization
* Some potential for having these on the stack (if the compiler deduces the size already at compile-time)
* More convenient for static analysis
* No plethora of confusing constructors (including the infernal two-element ctors which can be misinterpreted super-easily)
etc.
Comment by nemetroid 4 days ago
Comment by quuxplusone 4 days ago
But I don't think that makes such a container worth adding to the STL. So far, it hasn't even been worth writing in our own code. But that's the reason I've thought about writing it.
Comment by uecker 4 days ago
https://uecker.codeberg.page/2025-07-20.html
I probably will still add a version with capacity, because people may insist on it, but personally I like the one without much more so far.
Comment by ahartmetz 4 days ago
Comment by tialaramex 3 days ago
Unlike in std::unordered_map you are getting some value here, the RB tree is able to achieve meaningful efficiency gains from its use of pointers. The trouble is that your computer isn't a PDP-11, a hybrid which does fewer dereferences but has more locality will trade well here on a real computer built this century.
So, I'm torn, it's not awful but it's a problem that std::map is basically obliged to be a Red Black Tree even though that's not a good fit for today's machines.
Comment by einpoklum 4 days ago
Comment by ahartmetz 4 days ago
I see that problem much more often than crashes due to unchecked map lookups in production, which are very rare for me. Less than once a year.
Comment by pjmlp 5 days ago
Comment by Chaosvex 5 days ago
The standard library is mostly fine to use unless you have specific needs.
The bit about libraries is nonsense, sorry.
Comment by flohofwoe 5 days ago
Comment by Chaosvex 5 days ago
I mean, why are they blaming the standard library for inherent properties of linked lists? Yeah, you don't want to use them without good reason. That's just called picking the right data structure for the job, not a flaw with the standard library.
Some of the other choices were tradeoffs between performance and usability. The standard maps have stable iterators, whereas third-party implementations almost never do because you can write faster implementations if you're willing to live without those guarantees. Was it the right choice in hindsight? Maybe, maybe not.
I'd personally like to see a namespaced versioned standard library but like that's ever going to happen
Comment by flohofwoe 5 days ago
Comment by domenicd 5 days ago
- Keep a small stdlib, like JavaScript (especially earlier JavaScript): everyone complains about missing features, warring communities form around jQuery promises vs. Promises/A+ vs. callbacks, supply chain attacks, left-pad/is-even dependencies, etc.
- Grow a big stdlib while keeping backward compatibility, like C++: lots of cruft left around that must never be used, sitting next to newer stuff with similar names. People complain about the bloat.
- Grow a big stdlib and then break backward compatibility, like Python 2 -> 3: everyone is sad, the ecosystem churns for years.
I admit there are probably better and worse versions of each strategy, e.g., it seems to me like JavaScript's slow-but-steady accretion of primitives over time has gone OK, and it seems like apart from Python 2 -> 3 some of the PEPs I see for deprecations and replacements are reasonable. But no language has ever hit on a strategy that everyone loves, as far as I can tell.
Comment by Chaosvex 5 days ago
Comment by zabzonk 5 days ago
Edit: Also not sure what can possibly be downvoted here.
Comment by bregma 4 days ago
Comment by johannes1234321 4 days ago
Regular expressions in C++ are an example "everybody" advises against using, but it's still there. vector<bool> will stay forever and so on.
Comment by samiv 5 days ago
Also the nice thing about having a large set of features is that C,++ allows you to write very nice abstractions (or not) at both very low or at very high level. In other words you can be very low level with online ASM and bit operations and bit and direct memory manipulation or very high level almost like a script language. Whatever the problem domain needs C++ has got you covered.
Comment by zerr 5 days ago
As a side note, regarding your profile info, unless you are based in North Korea, please at least add one 0 to your rate. You'll get more long-term and high-quality clientele.
Comment by fc417fc802 5 days ago
Or even far less than that. I like to use it as C with lambdas and namespaces. Sprinkle in metaprogramming as needed. Even just not having to remember to call cleanup code thanks to dtors would alone be enough to sell me on it.
Comment by CupricTea 4 days ago
Comment by pjmlp 5 days ago
Back in the 90's, it was the main business language alongside Smalltalk, Delphi and VB.
Hence the plethora of C++ frameworks to chose from, sadly most dead since .NET and Java took over most of the use cases.
Comment by jdw64 5 days ago
Comment by randusername 4 days ago
That's what it's like to be a C++ programmer.
Comment by rewgs 4 days ago
I've been feeling this way about web dev for a while now, and sometimes look at C++ devs with jealousy, wishing that the crazy amount of memorization/varied standards/rough maintenance/high difficulty I experience were only limited to the language that I write.
Comment by fasterik 4 days ago
You'll end up with a strong understanding of the subset of the language that's actually useful for the thing you want to build.
Comment by epinephrinios 2 days ago
Comment by jviotti 4 days ago
Comment by logicchains 5 days ago
If you'd already been using it for 10+ years you wouldn't feel that way, because you'd already have memorized a lot of it.
Comment by Davidbrcz 5 days ago
- new features overlapping old features previous standards without replacing them or deprecating them. - new features not usable by the layman - ...
See function::copyable_function vs std::function, modules, coroutines, Reflection syntax is cryptic at best, ...
Comment by VoidWarranty 5 days ago
Hell, if you wait long enough, they'll just deprecate it before you can care to bother.
Comment by Davidbrcz 4 days ago
But if you work with C++ in professional context, you will encounter it somewhere (library, teamate's PR, legacy code, LLM output, book / blog / conference ...). |
You actually need to know the bad stuff to be able to judge it and discard it.
Comment by VoidWarranty 4 days ago
Im talking about your own personal coding. You dont have to use the new things. You dont have to know them to decide to discard them. In fact, the criteria to discard something is to not know it. You generally shouldn't be using things you dont know anyway.
The fact that other people use things you do not know is not a reason to stress out about the dumb pace and direction c++ is moving in. It is possible to enjoy a life free from fomo about the c++ standards goalposts.
Comment by kllrnohj 4 days ago
If someone tells you to write a web app, do you also cry? Surely there's more JavaScript frameworks than subsets of C++ at this point, no? Do you also go memorize all of them? Or do you just quickly pick one, and then only learn that one, and forget the rest exist? Because that's kinda how you approach C++. You pick a subset (like, say, just modern C++, only caring about C++17 & later or whatever), and just use that. And move on with your life. There's absolutely no reason to learn how std::auto_ptr works because it's dead in the same way you aren't learning how PHP & CGI works if you're making a modern web app. They're dead relics of the past that you can just pretend don't exist.
Comment by pjmlp 5 days ago
Many of us don't like C, it was already too little and too unsafe, when the first C++ compilers started to hit the market in early 1990's, hence why all desktop OSes moved into C++ for their frameworks.
The return to C has caused by the rise of FOSS, UNIX winning the server room, and early GNU coding standards to use only C as main compiled language.
Additionally as many other programming language ecosystems have discovered, it is easy to beat C++ in version 1.0, and eventually all of them grow to get the complexity of their own.
I reach for C++, because the language runtimes, compiler tooling, and GPGPU frameworks I care about are partially written in C++, and I am not in the place to be writing new ecosystems myself.
Comment by bregma 4 days ago
Most of our customers use C, probably for historic reasons but also because it is much much easier to reason about and that becomes very important when auditing for functional safety certification. If someone's life depends on your software, you really want to be able to reason about its correctness because orange jumpsuits enhance no one's complexion.
Many of customers are now using C++. From the problems they have reported, well, they just shouldn't. It's not that it is a bad language (it isn't) or that it is inherently unsafe (it really isn't: exceptions are safer than propagating return values as long as you use them in exception conditions, because not catching one will return you to a designed safe state very quickly, and RAII is the best thing since sliced cheese). It's that cutting and pasting from Stack Overflow, and now vibe coding, makes for massive codebases that are next to impossible to reason about. I now see a lot of problems from customers where my first reaction is "don't write code like that" and "you can write bad JavaScript code in any language, can't you?". While it butters my bread and I enjoy the language, I really recommend against using C++ for safety-certified embedded software. Stick to C.
Comment by pjmlp 4 days ago
It is quite relevant to note that the C authors, were keen to explore Alef as alternative on Plan 9, and based on the learnings reduced C's role on Inferno, and eventually took part in Go's design.
Even though they were not keen into using C++ (Plan 9 doesn't even support it), they were also aware C wasn't to be used for everything.
Comment by kllrnohj 4 days ago
You're almost certainly better off with Rust at this point or, if you must have C-like development, Zig.
Comment by bregma 4 days ago
Enthusiam and neat ideas are not sufficient to certify a development tool for functional safety.
Comment by steveklabnik 4 days ago
Comment by uecker 4 days ago
Comment by marcosdumay 4 days ago
There isn't even much of a "return" there. In fact, AFAIK, C++ expanded over C the entire time.
Comment by tenderfault 5 days ago
Comment by tialaramex 4 days ago
There are fundamental technical choices to deliver that, but also ergonomic things like notice Rust's []::sort is a stable sort, whereas C++ std::sort is an unstable sort. If you don't know about sort stability in Rust what you wrote works and in C++ you get a nasty surprise.
Comment by bregma 4 days ago
Comment by Mond_ 4 days ago
std::map (which is not a hash map, which is what most people would expect), std::move (which doesn't move), std::vector (which is not a vector), and std::vector<bool> (which is not even a std::vector).
Comment by tialaramex 4 days ago
That's not actionable information, except in the sense that the correct action is "don't use C++". Because sure, I know about sort stability, and I know about pointer provenance, and about memory ordering, but there might be any number of things I do not know and unfortunately in C++ "you should know and understand" absolutely everything at all times, which is not viable.
† The C++ standard library sorts are both much slower than in Rust, but hey, they're also both less safe so you're really getting the worst of both worlds
Comment by patrick451 4 days ago
Why, exactly, is the c++ std::sort "wrong"? There are tradeoffs both ways. You happen to prefer stable sorting to speed, but that is a preference not an objective fact.
Comment by tialaramex 4 days ago
It's silently an unstable sort, which is surprising, and then to add insult to injury it's also slower. Yeah, I know, the C++ unstable sort is so slow it's slower than Rust's stable sort.
YMMV for input types, sizes etc but generally that's what the numbers look like and though it's not universal it's actually quite common. "I bet the C++ is faster" is the wrong instinct, sometimes by a large margin.
Comment by jltsiren 4 days ago
I prefer the C++ naming convention, because it matches my expectations. When I studied CS, quicksort was considered the default sorting algorithm, and stable sorting was therefore a special case.
My pet peeve is that standard library sorting algorithms are still mostly single-threaded. Multicore CPUs have been the norm for ~20 years, but standard libraries still don't offer reasonable algorithms for sorting large arrays.
Comment by bregma 4 days ago
The problem does not appear to be in C++.
Comment by tialaramex 3 days ago
The choice to provide the unstable sort and then add a stable sort as an afterthought smells of the New Jersey approach to me. It was easier to do this, and too bad for the users, they weren't the priority.
It's the wrong choice because if you don't know about sort stability this outcome is surprising, so this means that although a beginner probably thinks they know what "sorting" means they actually mustn't use the sorting APIs in such a language until they've learned extra material.
† For cash, I don't like to owe people money, including having a mortgage
Comment by patrick451 3 days ago
Comment by tialaramex 2 days ago
Comment by jfoks 3 days ago
Sort stability does not matter when the sorting key is the only thing in your data being sorted. E.g. When I sort my M&Ms by color, I never keep them in the same order, because it doesn't matter. A red M&M is a red M&M. Nobody expects their red M&Ms to remain in the same order after sorting. I do tend to expect my M&M sorting to happen in-place. I expect to not need to provide additional candy holding bowls to later clean up that were used for temporary storage while my M&Ms were getting sorted. But I'll optionally grab additional bowls when I'm in a time crunch it if it speeds things up...
Now, if we're sorting all the cars on a parking lot by color, it may be more important to keep all the red cars in the same order where they started, for example if they were previously already sorted by brand, it /can/ be useful if that is preserved. But it's not guaranteed to be important or useful. Maybe the rich owner just want to torch all their red cars all together. I typically won't have access to additional temporary parking lots only used during sorting, or maybe the owner is coming with a flame thrower at 1PM and it has to be done as fast as possible whatever the cost. There is a tradeoff, rent additional parking lots during sorting, or take more time and do in-place stable sorting, or jumble up the car brands.
So what I want is control. That's all. Whether or not the ambiguous term 'sort' is stable or unstable, or in-place or not is just semantics. The only way to get clarity is to either use prior agreement, or to not use ambiguous names. Maybe a language should ban 'sort', and only allow 'foo_sort_bar' names with stability of memory usage postfixes or prefixes to 'inform' the developer. Neither choice is ideal and will satisfy everyone. It's like being a DJ at a high school party.
I'm not saying that the STL is great in practice, since it appears to optimize for usage flexibility with defined algorithmic and memory complexity at the big-O level, and mostly disregards actual real-life metrics. Arguing, however, that a language or library is better because an objectively ambiguous choice was made differently than your expectations is like arguing for fundamental superiority of either endianness over the other.
Comment by tialaramex 1 day ago
On the contrary, of course I can tell you that I was surprised and I'm far from alone. The fact you immediately grasped for "real world" comparisons ought to tell you that you're not thinking about this correctly because these are software sorts and so have very different affordances than the real world.
The claim that you wanted control doesn't make sense in the context of C++. There are in place stable sorts - the bubble sort you may have seen in class years ago is one, but C++ doesn't promise one in its standard library. However it does provide an unstable sort, which it just names "sort" and that's what I'm pointing at as a problem.
As to the "absolute fastest" you're in the wrong place if you've used a generic comparison sort expecting the "absolute fastest". For the machine integers it's usually not even the correct category of sort for "absolute fastest". But the C++ standard library is the wrong place to look even if you did need a generic comparison sort, because so much crap C++ exists and maintainers are scared to change anything for fear of what may happen.
Did you know libc++ didn't even have a guaranteed O(N log N) sort until the Joe Biden presidency? The introsort paper was written last century and the C++ standard itself did finally incorporate this basic requirement in 2011, but it took another decade for the Clang team to fix this.
Comment by jfoks 1 day ago
C++ is used by a lot of different people with a lot of different background, and... expectations...
My point is that "sort" is ambiguous and having expectations on ambiguity and arguing that a certain one is better is like arguing little endian being better or worse than bit endian.
Comment by nnevatie 5 days ago
The ecosystem isn't fine - just to get a project going requires picking a non-trivial set of tools and approaches, none of which the C++ standard enforces or guides to.
For example, will you manage dependencies via packages? If so, with what? What will you use for building your project? The list goes on and on.
Comment by Davidbrcz 5 days ago
The language keeps growing, with
- new features overlapping old features from previous standards without replacing them or deprecating them (function::copyable_function vs std::function, std::less<> key for transparent lookup in maps)
- new features not usable by the layman (coroutines ...)
- Cryptic syntax (reflection...)
- Stuff you are told not to use because of performance reason and that cant be fixed because of ABI (regex)
- Compile errors that are 1km long (no, concepts are not helping here, the 'nicer' message is still buried into a hot pile of template instantiation callstack).
Comment by bayindirh 5 days ago
It's easy to compare new and old languages, and saying older languages are wrinkly. Let's see how other shiny programming languages look like when they are 40 years old.
Comment by Davidbrcz 4 days ago
Sure, none is perfect and they have cruft and warts, but they are not such a mess as C++ is.
Comment by bregma 4 days ago
Comment by pjmlp 5 days ago
Comment by whstl 4 days ago
Comment by bregma 4 days ago
Comment by pjmlp 4 days ago
Comment by unclad5968 4 days ago
Comment by pjmlp 4 days ago
Comment by SJC_Hacker 4 days ago
Comment by bayindirh 5 days ago
sudo-rs was pulling in 1M+ LOC as its dependency chain at one point. I believe they removed the biggest offenders, but I didn't check it recently.
Comment by nnevatie 5 days ago
Comment by neals 4 days ago
However, I'm a my own kind of weird. I cannot watch a documentary that's made out of people saying short sentences. I get that it's made to 'have them tell the story', but I need a narrator to tell me what to think because I get distracted.
Still lots of love to the creators, of course.
Comment by Tomte 5 days ago
Comment by spacechild1 4 days ago
Apparently, they are making documentaries about open source software.
Comment by Tomte 4 days ago
Comment by garyrob 4 days ago
I had an idea for a special reminder app I wanted for myself. It's complicated enough that it comes to 9,000+ lines of code. I wanted to write it using the C++ UI library wxWidgets, because I like that wxWidgets uses native widgets, and is cross-platform, and that it's easy to make an app look nice. And that it doesn't use tons of memory.
There's a wxPython library, but I didn't want my UI to be limited due to whatever gaps may exist in that wrapper.
So I had AI write it in C++. Took about a day for me to get it done. It's perfectly solid. It did hit a couple of memory errors when I first used it, but I could give the AI MacOS crash report and the AI fixed the bugs easily, with no other involvement from me. (I compiled in a debug-friendly mode; no downside to that because it was just for me and was plenty fast enough.)
25 years or so ago, I was a fairly good C++ programmer. Haven't touched it since. And that includes this application, which was completely AI-written.
Comment by spacechild1 4 days ago
Comment by gverrilla 4 days ago
Comment by i_am_a_peasant 5 days ago
Comment by spacechild1 4 days ago
On top of that, C++ allows to design very concise APIs. (One of my favorite examples is sol2: https://github.com/ThePhd/sol2).
Library code involving templates, on the other hand, can be pretty complex and hard to read. Concepts and other C++20 features (like [[no_unique_address]]) are certainly an improvement, but only new projects with no backwards compatibility requirements can actually use them (unconditionally).
Comment by einpoklum 4 days ago
That's how you emulate language features that aren't there originally. I've "impelemented" a static code block, like in Java:
https://stackoverflow.com/a/34321324/1593077
and that's all in C++98. The implementation is a bit ugly but the use is terse and self-expalantory.
Comment by i_am_a_peasant 4 days ago
Comment by tonyedgecombe 5 days ago
Comment by Zardoz84 4 days ago
Comment by i_am_a_peasant 4 days ago
isn't kotlin supposed to be the future for JVM?
Comment by speed_spread 4 days ago
Comment by i_am_a_peasant 4 days ago
Comment by ElenaDaibunny 5 days ago
Comment by swader999 4 days ago
Comment by orsenthil 4 days ago
Comment by fasterik 4 days ago
Comment by orsenthil 4 days ago
Comment by martinky24 4 days ago
Comment by spacechild1 4 days ago
Comment by infoinlet 5 days ago
Comment by grugdev42 5 days ago
Comment by melenaboija 4 days ago
Comment by Maxatar 4 days ago
Comment by stackghost 4 days ago
Comment by jviotti 4 days ago
Comment by timedude 4 days ago
Comment by claiir 5 days ago
Because of AI, right?
Comment by kirtivr 4 days ago
The language which still supports C-style pointers, arbitrary datatype conversions, and inherits architecture-specific undefined behavior gives you too many ways to fail at solving a problem.
As a programmer, I love coding in C++ because I know what I'm doing. I'd hate reviewing C++ code though.
Comment by pjmlp 4 days ago
Comment by raincole 5 days ago
Comment by DesaiAshu 5 days ago
Coding languages have been developing for speed of (manual) writing - akin to how human languages did with modern alphabets. Now that writing is a lot easier, languages will likely evolve towards a focus on execution (or in the case of human languages, speed of reading and precision of understanding)
Comment by imtringued 4 days ago
Comment by marcosdumay 4 days ago
Comment by raincole 5 days ago
Comment by fasterik 4 days ago
AI is also probably more effective with statically typed languages since the compiler catches a wider range of errors.
Comment by randusername 4 days ago
- more accessible now that AI handles the high tooling activation energy
- more history and pre-AI internet content
- pybind11 is pretty popular to pair Python logic with C++ performance
- cpp committe is pretty bullish on new contracts and reflection features making C++ a glue language that AI can write well
Comment by pjmlp 4 days ago
Comment by tim333 4 days ago
Also
>It is because we have enduring demand for languages that are good at performance per watt.
(1 min in from above link)
Comment by bayindirh 5 days ago
Is this good or bad?
Comment by visha1v 5 days ago
Comment by pjmlp 4 days ago
Comment by tialaramex 5 days ago
All the popular PLs have this problem to some extent.
Comment by lordluca 4 days ago
Comment by fithisux 4 days ago
Pascal, D, /Common Lisp, Fortran
Comment by witx 4 days ago
Comment by keyle 5 days ago
+90% users in the past 3.5 years
huh? That is incredible growth. How is it even measured?Comment by aw1621107 5 days ago
[0]: https://www.slashdata.co/research/developer-population
Comment by fg137 4 days ago
And I wonder what the number is for other languages.
They want my email just to look at their "free report". Sorry that's not good to happen.
Comment by dr_lbd 22 hours ago
The makers of the documentary reached out to us to use our footage in the report and Bjarne has also used our report/blog when talking about the future of C++. In general, our hypothesis about its continued relevance is in line with what the documentary itself reports: developer numbers have grown massively and C++ has a very specific series of use cases that maintain its relevance.
Our methodology page is lengthy, but it can be summarised by the combination of several pieces of distinct information. We have labour statistics from various national governments to provide reference points, we use statistics from areas developers associate with (e.g. StackOverflow or GitHub) and compare against responses from inside the survey, and our own build-up of numbers based on the proportional data from within the survey (region, age, area, development, etc.). We have been doing this for many years. We also acknowledge in our reports that we are confident in all regions, but with greater uncertainty in the Greater China region, as we are a non-Chinese firm, so we have to work with partners in the region which minimises our confidence in the region.
The report lists the numbers for the major leading languages, basically any language that is used in multiple areas of development and has more than 500k users, give or take. It is not a perfect measure approach but it is about giving the most useful information at the highest level. We also exclude things like SQL because they are nor programming languages, unlike most of the other measures.
For the report, we typically have blogs available with similar information, but our free reports are designed for lead generation, which is why emails are asked for.
Comment by wscott 5 days ago
Comment by gizajob 5 days ago
Comment by serhii1992 4 days ago
Comment by nitotm 4 days ago
Comment by jalospinoso 4 days ago
Comment by sylware 4 days ago
Comment by Serhii-Set 5 days ago
Comment by Lapsa 5 days ago
Comment by jheriko 4 days ago
Comment by scott01 5 days ago
Comment by _hao 5 days ago
Comment by scott01 5 days ago
As for the language, yes, sadly, it’s with us seemingly to stay. I code it professionally and I can’t find a single interesting, or even good, thing about it. Apart from wide adoption of course. Everything about it feels extremely badly designed from the user perspective (though it’s probably technically very impressive) with many details, that probably the sanest strategy is to use a small subset of the language. At least I don’t have to use STL at work, that’s something positive, I guess :)
Comment by Chaosvex 5 days ago
It feels as though he just attracted an audience of junior developers who take everything he says as gospel, as is often the case with social media programmers. Lord knows I've argued with some of them and they usually crumble as soon as they don't have one of his opinions to throw back at you.
Comment by pulpbag 4 days ago
Can someone give me links to Bjarne Stroustrup's code? I tried searching but I'm having a hard time finding anything. I would like to verify some of the claims being made in the other comments (it's hard to tell if someone's code is better or worse relative to another person's without having access to the code and comparing important metrics and all that.)
Comment by Chaosvex 4 days ago
Comment by wiseowise 5 days ago
You can argue that chemical companies route is not the best, but cancer is here to stay and by some metrics adoption is actually growing.
Comment by panstromek 5 days ago