std :: string против строкового литерала для функций - PullRequest
2 голосов
/ 05 июля 2010

Мне было интересно, я обычно использую std :: string для своего кода, но когда вы передаете строку в параметре для простого сравнения, лучше просто использовать литерал?

Учтите этоfunction:

bool Message::hasTag(string tag)
{
    for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++)
    {
        if(m_tags[tagIndex] == tag)
            return 0;
    }

    return 1;
}

Несмотря на то, что свойство, с которым оно сравнивается, является вектором, и то, что использует эту функцию, вероятно, передаст ей строки, все же было бы лучше использовать const char *чтобы избежать создания новой строки, которая в любом случае будет использоваться как строковый литерал?

Ответы [ 3 ]

16 голосов
/ 05 июля 2010

Если вы хотите использовать классы, лучшим подходом здесь является константная ссылка:

bool Message::hasTag(const string& tag);

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

Передача указателя символа требует использования strcmp() для сравнения, так как есливы начнете сравнивать указатели напрямую, используя ==, возникнет ... проблема.

2 голосов
/ 05 июля 2010

Краткий ответ: это зависит.

Длинный ответ: std::string очень полезен, поскольку предоставляет множество вспомогательных функций для строк (поиск подстрок, извлечение подстрок, объединение строк и т. Д.). Он также управляет памятью, поэтому владение строкой не может быть перепутано.

В вашем случае вам тоже не нужно. Вам просто нужно знать, соответствует ли какой-либо из объектов в m_tags данной строке. Так что для вашего случая вполне достаточно написать функцию с использованием const char *s.

Однако, как примечание: вы почти всегда хотите предпочитать std::string над (const) char *, когда говорите о возвращаемых значениях . Это связано с тем, что строки C не имеют никакой семантики владения, поэтому функция, возвращающая const char *, должна быть очень тщательно задокументирована, объясняя, кому принадлежит указанная память (вызывающий или вызываемый) и, в случае, если вызываемый получает ее, как освободить это (delete[], delete, free, что-то еще).

1 голос
/ 05 июля 2010

Я думаю, что было бы достаточно передать ссылку, а не значение string.Я имею в виду:

bool Message::hasTag(const string& tag)

Это скопировало бы только ссылку на исходное значение string.Который в любом случае должен быть создан где-то, но вне функции.Эта функция вообще не будет копировать свой параметр.

Поскольку m_tags в любом случае является вектором строк (я полагаю), лучше использовать параметр const string&.

...