C ++ строковые литералы против константных строк - PullRequest
7 голосов
/ 06 декабря 2010

Я знаю, что строковые литералы в C / C ++ имеют статическую длительность хранения , что означает, что они живут "вечно", т. Е. До тех пор, пока работает программа.

Таким образом, если у меня естьфункция, которая вызывается очень часто и использует строковый литерал, например:

void foo(int val)
{
    std::stringstream s;
    s << val;
    lbl->set_label("Value: " + s.str());
}

, где функция set_label принимает const std::string& в качестве параметра.

Должен ли я использовать const std::string здесь вместо строкового литерала или это ничего не изменит?

Мне нужно минимизировать как можно больше потребления памяти во время выполнения.

edit:

Я хотелсравните строковый литерал с const std::string prefix("Value: ");, который инициализируется в каком-то файле заголовка константы.

Кроме того, здесь конкатенация возвращает временный объект (давайте назовем его Value: 42, и постоянная ссылка на этот временный объект передается функции set_text(), я прав в этом?

Спасибо еще раз!

Ответы [ 4 ]

9 голосов
/ 06 декабря 2010

Ваша программа работает с одним и тем же литералом каждый раз. Нет более эффективной формы хранения. Std :: string будет создаваться, дублироваться в куче, а затем освобождаться при каждом запуске функции, что приведет к полной потере.

2 голосов
/ 06 декабря 2010

Это будет использовать меньше памяти и работать намного быстрее (используйте snprintf, если ваш компилятор поддерживает это):

void foo(int val)
{
    char msg[32];
    lbl->set_label(std::string(msg, sprintf(msg, "Value: %d", val)));
}

Для еще более быстрых реализаций, проверьте С ++: производительность: от integer до std:: преобразование строки

0 голосов
/ 06 декабря 2010

Храните их в каком-либо ресурсе и загружайте / выгружайте их по мере необходимости.

0 голосов
/ 06 декабря 2010

Как вы будете строить свой const std :: string? Если вы сделаете это из какой-нибудь строки literral, в конце концов, это будет просто хуже (или идентично, если компилятор делает хорошую работу). Строковый литерал не потребляет много памяти, а также статической памяти, которая может быть не той памятью, которой у вас мало.

Если вы можете прочитать все свои строковые литералы, скажем, из файла, и вернуть память ОС, когда строки больше не используются, может быть какой-то способ уменьшить объем памяти (но, вероятно, это замедлит работу программы). много).

Но, возможно, есть много других способов уменьшить потребление памяти, прежде чем делать подобные вещи.

...