public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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

  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).