From: Oleg Endo <oleg.endo@t-online.de>
To: Trevor Saunders <tbsaunde@tbsaunde.org>
Cc: Jeff Law <law@redhat.com>,
Richard Biener <richard.guenther@gmail.com>,
Aldy Hernandez <aldyh@redhat.com>,
Martin Sebor <msebor@gmail.com>,
gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: protected alloca class for malloc fallback
Date: Wed, 10 Aug 2016 17:03:00 -0000 [thread overview]
Message-ID: <1470848609.639.405.camel@t-online.de> (raw)
In-Reply-To: <20160809174139.GA18239@ball>
On Tue, 2016-08-09 at 13:41 -0400, Trevor Saunders wrote:
> If what you want is the ability to put the buffer on the stack
> instead of the heap then I think a stack_string class that
> interoperates with your string class is the thing you want.
I'd avoid a separate stack_string class. Instead use a linear
allocator with storage allocated on the stack, e.g.:
typedef std::basic_string<char, std::char_traits<char>,
linear_allocator<char>
my_tmp_string;
void bleh (int foo)
{
linear_allocator<char> buffer (alloca (1024), 1024);
tmp_string aaa (buffer);
aaa += "test";
aaa += "moon";
...
// what happens when "buffer" runs out of space?
// throw? switch to heap alloc? ...
}
>
> I don't really see anything wrong with a string class being a really
> fancy smart pointer that has a bunch of useful string stuff on it.
That's what std::string basically is?
> As for operator == I'd be fairly ok with that, other than it hiding
> a O(N) operation in ==.
Yes, it makes it more difficult to carry out algorithm complexity
analysis using grep...
> Regretably necessary sure, but I'm not sure its funny.
Hence the quotes.
> The first big problem with using the stl is that the subset available
> in C++98 isn't that great, you could maybe hack up libstdc++ so that
> you can use newer types just without the bits that use newer language
> features, but that would take some work.
Or just wait until people have agreed to switch to C++11 or C++14. I
don't think in practice anybody uses an C++11-incapable GCC to build a
newer GCC these days.
> The other big problem is that the stl is often too general, and tries
> to be too simple. std::string is actually a good example of both of
> those problems. There's really no reason it should use size_t
> instead of uint32_t for the string length / capacity.
Yes, some of the things in the STL are collections of compromises for
general-purpose usage. If you're doing something extra fancy, most
likely you can outperform the generic STL implementation. But very
often it's actually not needed.
> It would also be a lot better if it had separate types for strings
> where you want an internal buffer or don't.
Using custom allocators is one way. For example ...
template <unsigned int BufferSize> struct linear_allocator_with_buffer;
template <unsigned int BufferSize>
using stack_string =
std::basic_string<char, std::char_traits<char>,
linear_allocator_with_buffer<BufferSize>>;
But then ...
stack_string<32> a = "a";
stack_string<64> b = "b";
b += a;
... will not work because they are different types.
One drawback of using custom allocators for that kind of thing is being
unable to pass the above stack_string to a function that takes a "const
std::string&" because they differ in template parameters. But that's
where std::string_view comes in.
Cheers,
Oleg
next prev parent reply other threads:[~2016-08-10 17:03 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-04 11:30 Aldy Hernandez
2016-08-04 12:58 ` Richard Biener
2016-08-04 15:19 ` Aldy Hernandez
2016-08-04 19:24 ` Jeff Law
2016-08-05 14:37 ` Aldy Hernandez
2016-08-05 15:15 ` Pedro Alves
2016-08-05 16:23 ` Jeff Law
2016-08-05 17:48 ` Richard Biener
2016-08-05 8:17 ` Richard Biener
2016-08-04 19:06 ` Pedro Alves
2016-08-04 19:16 ` Jeff Law
2016-08-04 19:22 ` Pedro Alves
2016-08-04 19:26 ` Jeff Law
2016-08-04 19:31 ` Pedro Alves
2016-08-05 2:10 ` Martin Sebor
2016-08-05 14:42 ` Aldy Hernandez
2016-08-05 17:56 ` Richard Biener
2016-08-05 18:16 ` Oleg Endo
2016-08-05 20:07 ` Richard Biener
2016-08-06 10:09 ` Aldy Hernandez
2016-08-06 10:15 ` Aldy Hernandez
2016-08-06 15:08 ` Richard Biener
2016-08-08 17:00 ` Jeff Law
2016-08-08 17:32 ` Trevor Saunders
2016-08-08 19:03 ` Richard Biener
2016-08-09 11:34 ` Oleg Endo
2016-08-09 17:34 ` Trevor Saunders
2016-08-10 17:03 ` Oleg Endo [this message]
2016-08-11 1:23 ` Trevor Saunders
2016-08-11 12:18 ` Oleg Endo
2016-08-11 17:55 ` Trevor Saunders
2016-08-20 2:29 ` Mike Stump
2016-08-21 20:00 ` C++11? (Re: protected alloca class for malloc fallback) Pedro Alves
2016-08-22 7:10 ` Trevor Saunders
2016-08-22 7:28 ` Richard Biener
2016-08-22 12:02 ` Eric Gallager
2016-08-22 12:58 ` Manuel López-Ibáñez
2016-08-22 22:08 ` Mike Stump
2016-08-23 23:17 ` Eric Gallager
2016-08-09 13:17 ` protected alloca class for malloc fallback Aldy Hernandez
2016-08-09 13:21 ` Bernd Schmidt
2016-08-10 10:04 ` Richard Biener
2016-08-10 10:12 ` Aldy Hernandez
2016-08-10 10:39 ` Richard Biener
2016-08-10 18:00 ` Jeff Law
2016-08-10 18:33 ` Richard Biener
2016-08-16 16:28 ` Jeff Law
2016-08-16 16:44 ` Jakub Jelinek
2016-08-16 16:47 ` Jeff Law
2016-08-16 17:54 ` Martin Sebor
2016-08-17 8:27 ` Richard Biener
2016-08-17 13:39 ` Martin Sebor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1470848609.639.405.camel@t-online.de \
--to=oleg.endo@t-online.de \
--cc=aldyh@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=law@redhat.com \
--cc=msebor@gmail.com \
--cc=richard.guenther@gmail.com \
--cc=tbsaunde@tbsaunde.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).