Я согласен с другими плакатами, что вы должны использовать строку.
Но знайте, что в зависимости от того, насколько агрессивно ваш компилятор оптимизирует временные файлы, у вас, вероятно, будут дополнительные накладные расходы (из-за использования динамического массива символов). (Примечание: хорошая новость заключается в том, что в C++0a разумное использование ссылок rvalue не потребует оптимизации компилятора для повышения эффективности — и программисты смогут дать некоторые дополнительные гарантии производительности своего кода, не полагаясь на качество компилятор.)
В вашей ситуации стоит ли вводить дополнительные накладные расходы для ручного управления памятью? Большинство разумных программистов не согласятся, но если у вашего приложения действительно возникнут проблемы с производительностью, следующим шагом будет профилирование вашего приложения — таким образом, если вы вносите сложность, вы делаете это только тогда, когда у вас есть убедительные доказательства того, что это необходимо для улучшения. общая эффективность.
Кто-то упомянул, что оптимизация возвращаемого значения (RVO) здесь не имеет значения - я не согласен.
Стандартный текст (С++ 03) по этому поводу гласит (12.2):
[Начало стандартной цитаты]
Временные типы класса создаются в различных контекстах: привязка rvalue к ссылке (8.5.3), возврат rvalue (6.6.3), преобразование, создающее rvalue (4.1, 5.2.9, 5.2.11, 5.4) , создание исключения (15.1), вход в обработчик (15.3) и некоторые инициализации (8.5). [Примечание: время жизни объектов-исключений описано в 15.1. ] Даже когда создание временного объекта избегается (12.8), все семантические ограничения должны соблюдаться, как если бы временный объект был создан. [Пример: даже если конструктор копирования не вызывается, все семантические ограничения, такие как доступность (пункт 11), должны быть удовлетворены. ]
[Example:
struct X {
X(int);
X(const X&);
˜X();
};
X f(X);
void g()
{
X a(1);
X b = f(X(2));
a = f(a);
}
Здесь реализация может использовать временный объект для создания X(2) перед передачей его в f() с помощью конструктора копирования X; в качестве альтернативы, X(2) может быть создан в пространстве, используемом для хранения аргумента. Кроме того, можно использовать временное хранилище для хранения результата f(X(2)) перед его копированием в b с помощью конструктора копирования X; в качестве альтернативы результат f() может быть построен в b. С другой стороны, выражение a=f(a) требует временного выражения либо для аргумента a, либо для результата f(a), чтобы избежать нежелательного наложения алиасинга a. ]
[Конец стандартной цитаты]
По сути, текст выше говорит о том, что вы можете полагаться на RVO в ситуациях инициализации, но не в ситуациях присваивания. Причина в том, что когда вы инициализируете объект, то, чем вы его инициализируете, никак не может быть псевдонимом самого объекта (поэтому вы никогда не выполняете самопроверку в конструкторе копирования), но когда вы делаете задание, это может.
В вашем коде нет ничего, что по своей сути запрещало бы RVO, но прочитайте документацию вашего компилятора, чтобы убедиться, что вы действительно можете положиться на него, если он вам действительно нужен.
person
Faisal Vali
schedule
23.06.2009