Разворачивание var args в AS3

Я не волновался бы об этом. Если Вы сделаете это в цикле, то строки будут всегда предварительно выделять память для уменьшения перераспределений - просто используют 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+= может использоваться, но Вам были бы нужны ужасные круглые скобки для фиксации приоритета.

9
задан BefittingTheorem 10 September 2009 в 14:55
поделиться

1 ответ

Метод 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);
        }

    }

}
12
ответ дан 4 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: