2010-12-05 2 views
6

Я знаю, что строковые литералы в C/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 вместо строкового литерала, или это не имеет значения?

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

редактировать:

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

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

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

+0

Что твоя магия 8 шар сказать? – 2010-12-05 22:59:41

+0

Если вы хотите минимизировать потребление памяти во время выполнения, как насчет изменения set_label для принятия const char * и использовать char * вместо строки? – user347594 2010-12-05 23:02:14

+0

@ user347594: Я не могу изменить `set_label`, к сожалению, – 2010-12-05 23:07:32

ответ

9

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

0

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

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

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

0

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

2

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

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

Для еще более быстрой реализации, проверьте C++ performance challenge: integer to std::string conversion

Смежные вопросы