Как делают я выделяю станд.:: строка на стеке с помощью строковой реализации glibc?

Я не знаю, как сделать это напрямую в SSMS. Может быть, создать несколько подключений к одному экземпляру на зарегистрированных серверах и затем запустить группу. Тем не менее, есть несколько сторонних приложений, которые могут помочь вам в этом. Вот 2 варианта:

17
задан Daniel A. White 23 April 2009 в 23:17
поделиться

5 ответов

Недавно я хотел сделать это сам и обнаружил следующий код:

stack_container.h Chronium

Он определяет новый std :: allocator , который может обеспечить выделение на основе стека для начального выделения памяти для контейнеров STL. Я нашел другой способ решения своей конкретной проблемы, поэтому сам не использовал код, но, возможно, он будет вам полезен. Обязательно прочитайте комментарии в коде, касающиеся использования и предостережений.

Тем, кто поставил под сомнение полезность и разумность такого подхода, подумайте:

  • Часто вы априори знаете, что ваша строка имеет разумный максимальный размер. Например, если в строке будет храниться 32-разрядное целое число в десятичном формате, вы знаете, что для этого нужно не более 11 символов. В этом случае не требуется строка, которая может динамически увеличиваться до неограниченного размера.
  • Во многих случаях выделение из стека происходит быстрее, чем выделение из кучи.
  • Если строка часто создается и уничтожается (предположим, что является локальной переменной в часто используемой служебной функции), выделение из стека вместо кучи позволит избежать оттока фрагментов в распределителе кучи. Для приложений, которые используют много памяти, это может изменить игру.

Некоторые люди отмечают, что строка, использующая выделение на основе стека, не будет std :: string , как будто это каким-то образом уменьшает его полезность. Правда, вы не можете использовать их взаимозаменяемо, поэтому вы не сможете передать стековую строку функциям, ожидающим std :: string . Но (если вы делаете это правильно), вы сможете использовать все те же функции-члены в вашей стековой строке , которые вы используете сейчас в std :: string , например find_first_of () , append () и т. д. begin () и end () будут работать нормально, поэтому вы сможете использовать многие алгоритмы STL. Конечно, это не будет std :: string в самом строгом смысле этого слова, но в практическом смысле оно все равно будет «строкой», и все равно будет весьма полезным.

Вы сможете использовать многие алгоритмы STL. Конечно, это не будет std :: string в самом строгом смысле этого слова, но в практическом смысле оно все равно будет «строкой», и все равно будет весьма полезным.

Вы сможете использовать многие алгоритмы STL. Конечно, это не будет std :: string в самом строгом смысле этого слова, но в практическом смысле оно все равно будет «строкой», и все равно будет весьма полезным.

22
ответ дан 30 November 2019 в 12:07
поделиться

The problem is that std::basic_string has a template parameter for the allocator. But std::string is not a template and has no parameters.

So, you could in principle use an instantiation of std::basic_string with an allocator that uses memory on the stack, but it wouldn't be a std::string. In particular, you wouldn't get runtime polymorphism, and you couldn't pass the resulting objects into functions expecting a std::string.

11
ответ дан 30 November 2019 в 12:07
поделиться

You can't. Except...

std::string is an instantiation of

std::basic_string<class CharType, 
                  class Traits=char_traits<CharType>, 
                  class Allocator=allocator<CharType> >

You could conceivably define an Allocator class that uses alloca for memory management. This would only work if the Allocator itself, and the basic_string methods that invoke it directly or indirectly, are all inline. A basic_string object created with this allocator would not be a std::string, but it would behave (mostly) like it. However, this would be a fair amount of work for limited gains. Specifically, using this class to return values from a function would be a career-limiting move.

I have no idea why you or anyone else would want to do this.

4
ответ дан 30 November 2019 в 12:07
поделиться

I suspect that doing such a thing would be difficult to do, I wonder why you want to do it? To allocate something entirely on the stack, the compiler needs to know at compile time what the exact size of the thing is - in your example it would need to know not only the size of the std::string metadata, but also the size of the string data itself. This isn't too flexible, you would probably need different string types depending on the size of the string data you are wanting to include in it - not that it would be impossible to do, just it would tend to complicate things up a bit.

0
ответ дан 30 November 2019 в 12:07
поделиться
  • std::string will always manage it's internal storage with new/delete.
  • Not sure why your question contains glibc’s string implementation. The string implementation of the c++ standard library has nothing to do with glibc.
  • The only way to store a string on the stack is to use a C char array on the stack (like what Shhnap outlined). But that's probably not what you want anyway :-)
-3
ответ дан 30 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: