Как и многие люди, я имею привычку писать новые строковые функции как функции от const std::string &
. Преимущества заключаются в эффективности (вы можете передавать существующие объекты std::string
без накладных расходов на копирование / перемещение) и гибкости / читаемости (если все, что у вас есть, это const char *
, вы можете просто передать его, и конструкция будет выполнена неявно, без загромождения. ваш код с явной конструкцией std::string
):
#include <string>
#include <iostream>
unsigned int LengthOfStringlikeObject(const std::string & s)
{
return s.length();
}
int main(int argc, const char * argv[])
{
unsigned int n = LengthOfStringlikeObject(argv[0]);
std::cout << "'" << argv[0] << "' has " << n << " characters\n";
}
Моя цель - написать эффективный кросс-платформенный код, который может эффективно обрабатывать длинные строки. У меня вопрос, что происходит во время неявной конструкции? Есть ли гарантии, что строка не будет скопирована? Мне кажется, что, поскольку все const
, в копировании нет необходимости - все, что нужно - это тонкая оболочка STL вокруг существующего указателя, но я не уверен, насколько зависит от компилятора и платформы, я должен ожидать, что такое поведение будет . Будет ли безопаснее всегда явно писать две версии функции, одну для const std::string &
и одну для const char *
?