3 ms·
> "std::string" is a container, which means using it causes unnecessary inefficiency. std::string is a particular data structure, consisting of a pointer to a
by comex 6y ago
> "std::string" is a container, which means using it causes unnecessary inefficiency.
std::string is a particular data structure, consisting of a pointer to a heap allocation, a length value, and a capacity value; or alternately a "small string" that fits into the std::string structure itself.
There is nothing inherently inefficient about using std::string compared to implementing a similar data structure by hand; in that sense it's a "zero-cost abstraction". You can benefit from doing it yourself if you want a different data structure that provides a different feature set, such as if you don't need dynamic resizing, or if you want to refer to existing memory directly rather than giving each string its own heap allocation. But the data structure implemented by std::string is a reasonable choice for lots of scenarios. (Alternately, you might be able to just write a more efficient implementation of std::string than the implementation in whatever standard library you're using, but most standard libraries are reasonably well optimized.)
> How do you think it was implemented? C++ was written in C, by using its functions and data types.
All C++ standard library implementations, and most C++ compilers, are written in C++. The standard library does of course use primitive types such as pointers, which are shared with C, but that's not the same thing as being written in C. That said, most C++ standard library implementations do use some C standard library functions, though they don't have to. In particular, std::string implementations are likely to use memcpy/memmove to copy strings, and malloc for the heap allocations.
But they don't use the 'str' family of C standard library functions, the functions one would typically learn about when learning how to use strings in C. They can't, since those functions don't handle interior nul bytes, which std::string is required to support. Those functions are also unnecessarily inefficient when you know the string length, as std::string does.
> write in C++ without the "Modern" stuff (which is possible, and this is what expert programmers that write quality software do).
Expert C++ programmers know which parts of "modern" C++ have zero cost and can be used freely, which parts have low but acceptable cost compared to the increased memory safety and ergonomics, and which parts are best to avoid. Programmers who avoid the modern stuff entirely are mostly those who don't know C++ very well.
That said, C++ is a convoluted language that is unnecessarily difficult to become an expert in, and unnecessarily difficult (but not impossible) to write efficient code in even if you are an expert.
- pelmo 6y agoI'm sorry, I don't understand why am being educated here, meanwhile I know how things work, both in C and C++. I literally got downvoted for contributing my opinion (not an advice) on what a person whom I replied wanted to know to better understand C++ without its complexity, because some people thought "that you shouldn't learn how to work with strings". Which is ridiculous. Now I regret doing so. But I've read what you wrote anyway. You contradict yourself here: >There is nothing inherently inefficient about using std::string >it's a "zero-cost abstraction" >You can benefit from doing it yourself You could've asked if I don't know something that I'm talking about, I could've clarified. > But the data structure implemented by std::string is a reasonable choice for lots of scenarios For example, these "lots of scenarios" do not include the projects I'm working on, and for a good reason. >most C++ compilers, are written in C++ I'm aware of self-hosting. The point that I was trying to convey is that, at some point, the "unsafe and poor C" was used in order to create that language, and further improve it. >Expert C++ programmers know which parts of "modern" C++ have zero cost and can be used freely And those are things that do not start with "std::" >unnecessarily difficult to become an expert in There's a difference between being an expert software engineer and expert in a particular programming language's architecture. First one involves understanding systems and know how to solve problems efficiently; second one doesn't require you writing complex software, rather learn from the docs and stay up to date with the new features without ever programming quality software.
- gumby 6y agoSide point: > I literally got downvoted for contributing my opinion I noticed that but my one upvote was not sufficient. Discussing upvoting / downvoting is discouraged on this site but I consider that unfortunate, as the votes (well, downvotes in particular) are part of the signal. Unfortunately they are also frequently used for "I disagree" rather than "this is off topic". I disagree with you but like every other user have the opportunity to express that by typing a response.
- comex 6y ago> I'm aware of self-hosting. The point that I was trying to convey is that, at some point, the "unsafe and poor C" was used in order to create that language, and further improve it. You wrote: > "std::string" is a container, which means using it causes unnecessary inefficiency. How do you think it was implemented? C++ was written in C, by using its functions and data types. Your wording strongly implies that the implementation of std::string is written in C, or at least that C++ is somehow layered over C in a way that explains the "unnecessary inefficiency" (which you could bypass by using C directly). The fact that the first C++ compilers, historically speaking, were written in C seems quite irrelevant. Perhaps you were trying to convey that the implementation of the C++ standard library is more C-like than typical C++, because it is lower-level and can't rely on the bits of the standard library that it's trying to implement? But that is also not what you said. > > Expert C++ programmers know which parts of "modern" C++ have zero cost and can be used freely > And those are things that do not start with "std::" If you are as much of an expert as you say, I assume you are engaging in rhetorical hyperbole.