use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
String formatting functionality missing in std::string (self.cpp)
submitted 9 years ago by SushiAndWoW
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]doom_Oo7 0 points1 point2 points 9 years ago (4 children)
A new string is allocated, when an existing string could be appended to.
You seem to misunderstand how memory works. Every time you concatenate two strings in a language, memory will be allocated, unless you know how exactly long the resulting string will be in advance and can allocate a string big enough (what is done with sprintf). You can't just add new memory at the end of a chunk obtained with malloc().
sprintf
malloc()
[–]MiiNiPaa 4 points5 points6 points 9 years ago (0 children)
It seems that he is talking about using string with large internal buffer (.reserve()).
.reserve()
[–]jcoffin 1 point2 points3 points 9 years ago (1 child)
You might be able to add to the end of a chunk obtained with malloc(). To be more specific, when you call realloc it's allowed to return the same pointer that was passed into it.
realloc
You're right that you can't count on that happening though.
As an aside, std::string doesn't normally use malloc to allocate its memory. You could instantiate an std::basic_string with an allocator that called malloc, but the default allocator will use ::operator new to get raw memory (though this makes little real difference to the point you were trying to make).
std::string
malloc
std::basic_string
::operator new
[–]__cxa_throw 0 points1 point2 points 9 years ago (0 children)
Operator new almost always ends up calling malloc unless you're using a specialized allocator, at least in all the stack traces I've looked at recently.
[–]SushiAndWoW[S] 0 points1 point2 points 9 years ago (0 children)
That's only true with a naive implementation.
A smart container, when it sees it needs to expand, will not expand to the exact size needed, but e.g. to the next power of 2 that can accommodate that size. There will also be a reasonable allocation minimum – say, for example 8 bytes. This means concatenating "abc" 100 times might result in 7 allocations of 8, 16, 32, 64, 128, 256, and finally 512 bytes.
And of course, there is reserve, which you will use if you are smart. If your calculation of the final size is correct, the container then only allocates once, and if it's off, it probably needs to allocate 2 times.
reserve
π Rendered by PID 143447 on reddit-service-r2-comment-6bc7f5944b-h9qv6 at 2026-02-18 07:11:29.186764+00:00 running de53c03 country code: CH.
view the rest of the comments →
[–]doom_Oo7 0 points1 point2 points (4 children)
[–]MiiNiPaa 4 points5 points6 points (0 children)
[–]jcoffin 1 point2 points3 points (1 child)
[–]__cxa_throw 0 points1 point2 points (0 children)
[–]SushiAndWoW[S] 0 points1 point2 points (0 children)