Я не волновался бы об этом. Если Вы сделаете это в цикле, то строки будут всегда предварительно выделять память для уменьшения перераспределений - просто используют operator+=
в этом случае. И если Вы делаете это вручную, что-то вроде этого, или дольше
a + " : " + c
Тогда это создает временные файлы - даже если компилятор мог бы устранить некоторые копии возвращаемого значения. Это вызвано тем, что в последовательно названном operator+
это не знает, ссылается ли параметр ссылки на именованный объект, или временный файл возвратился из вызова sub operator+
. Я не волновался бы об этом прежде не представил сначала. Но давайте возьмем пример для показа этого. Мы сначала представляем круглые скобки, чтобы ясно дать понять привязку. Я поместил аргументы непосредственно после объявления функции, это используется для ясности. Ниже этого я показываю, каково получающееся выражение тогда:
((a + " : ") + c)
calls string operator+(string const&, char const*)(a, " : ")
=> (tmp1 + c)
Теперь, в том дополнении, tmp1
то, что было возвращено первым вызовом к оператору + с показанными аргументами. Мы предполагаем, что компилятор действительно умен и оптимизирует копию возвращаемого значения. Таким образом, мы заканчиваем с одной новой строкой, которая содержит конкатенацию a
и " : "
. Теперь, это происходит:
(tmp1 + c)
calls string operator+(string const&, string const&)(tmp1, c)
=> tmp2 == <end result>
Сравнивают это со следующим:
std::string f = "hello";
(f + c)
calls string operator+(string const&, string const&)(f, c)
=> tmp1 == <end result>
Это использует ту же функцию для временного файла и для именованной строки! Таким образом, компилятор имеет , чтобы скопировать аргумент в новую строку и добавить к этому и возвратить его из тела [1 111]. Это не может взять память временного файла и добавить к этому. Чем больше выражение, тем должно быть сделано больше копий строк.
Следующая Visual Studio и GCC будут поддерживать C++ 1x's семантика перемещения (дополнение семантика копии ) и rvalue ссылки как экспериментальное дополнение. Это позволяет выяснять, ссылается ли параметр на временный файл или нет. Это сделает такие дополнения удивительно быстро, поскольку все вышеупомянутое закончится в одном "добавлять-конвейере" без копий.
, Если это оказывается узким местом, можно все еще сделать
std::string(a).append(" : ").append(c) ...
append
, вызовы добавляют аргумент [1 113] и затем возвращают ссылку на себя. Таким образом, никакое копирование временных файлов не сделано там. Или альтернативно, эти operator+=
может использоваться, но Вам были бы нужны ужасные круглые скобки для фиксации приоритета.
Метод apply () для всех функций позволяет передавать аргументы в массиве вместо «обычного» способа.
package {
import flash.display.Sprite;
public class Foo extends Sprite {
public function Foo() {
var args:Array = ["a", "b", "c"];
// "normal" call
varArgsFunc(args);
// what you wanted:
varArgsFunc.apply(null, args);
}
public function varArgsFunc(...args):Array {
trace("got", args);
}
}
}