Производительность Интеллектуального указателя C++

MDN:

getElementsByName () : метод объекта Document возвращает коллекцию элементов NodeList с заданным имя в документе

blockquote>

Вы можете получить доступ к первому элементу, используя [0]

function change(){
  console.log(document.getElementsByName('fruits')[0].value)
}
[1113 ]

18
задан amit 21 November 2008 в 11:24
поделиться

6 ответов

Разыменование интеллектуальных указателей обычно тривиально, конечно, для повышения режима выпуска. Все проверки повышения во время компиляции. (Интеллектуальные указатели могли в теории делать умный материал через потоки). Это все еще оставляет много других операций. Nicola упомянул конструкцию, копирование и разрушение. Это не полный набор, все же. Другие важные операции подкачивают, присвоение и сбрасывают к ПУСТОМУ УКАЗАТЕЛЮ. В основном, любая операция, которая требует изящества.

Примечание, что некоторые из этих операций исключены некоторыми интеллектуальными указателями. Например, boost::scoped_ptr не может даже быть скопирован, уже не говоря о быть присвоенным. Как это оставляет меньше операций, реализация может быть оптимизирована для этого меньшего количества методов.

На самом деле, с подъемом TR1, довольно вероятно, что компиляторы могут добиться большего успеха с интеллектуальными указателями, чем необработанные указатели. Например, возможно, что компилятор может доказать, что умный non-copyable указатель не искажается в некоторых ситуациях, просто потому что это - non-copyable.Подумайте об этом: искажение происходит, когда два указателя создаются указывающий на тот же объект. Если бы первый указатель не может быть скопирован, как второй указатель закончил бы тем, что указал на тот же объект? (Существуют пути вокруг этого, также - оператор* должен возвратить lvalue)

21
ответ дан 30 November 2019 в 07:09
поделиться

Считаемые на ссылку интеллектуальные указатели (наиболее распространенный тип) только стоят больше, когда Вы копируете, создаете и удаляете их. Эти дополнительные расходы могут быть существенными при копировании много потому что большинство из них ориентировано на многопотоковое исполнение.

, Если Вы просто хотите указатель "автоудаления", существует, очень порочил auto_ptr, или новое и солнечное (но не очень поддерживаемый все же) unique_ptr от C++ 0x.

2
ответ дан 30 November 2019 в 07:09
поделиться

Единственный способ иметь дело с проблемами производительности состоит в том, чтобы представить Ваш код. Самая большая часть проблем производительности предполагается так или иначе; только профилирование укажет Вам, где Ваши узкие места лежат.

, Если оказывается, что использование интеллектуальных указателей производит узкое место, где необработанные указатели не делают, используйте необработанные указатели! До тех пор я не волновался бы слишком много об этом; большинство операций на интеллектуальных указателях довольно быстро. Вы, вероятно, сравниваете строки слишком часто (или что-то как этот), чтобы они имели значение.

6
ответ дан 30 November 2019 в 07:09
поделиться

Повышение обеспечивает различные интеллектуальные указатели. Обычно и размещение памяти, которое варьируется по соответствию с видом интеллектуального указателя и производительности, не должно быть проблемой. Для сравнения производительности можно проверить этот http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smarttests.htm .

, Поскольку Вы видите только конструкцию, копия и разрушение приняты во внимание для сравнения производительности, что означает, что разыменование интеллектуального указателя имеет, предположительно, ту же стоимость как тот из необработанного указателя.

следующий отрывок демонстрирует, что нет никакой потери производительности при помощи shared_ptr<> вместо необработанного указателя:

#include <iostream>
#include <tr1/memory>

int main()
{
#ifdef USE_SHARED_PTR
    std::tr1::shared_ptr<volatile int> i(new int(1));
#else
    volatile int * i = new int(1);
#endif

    long long int h = 0;

    for(long long int j=0;j < 10000000000LL; j++)
    {
        h += *i;
    }

    std::cout << h << std::endl;
    return 0;
}
7
ответ дан 30 November 2019 в 07:09
поделиться

Существует часто пропускаемая социальная гостиница между "вручную" управляемая std::vector<T*> (т.е. необработанные указатели) и std::vector<boost::shared_ptr<T> >, в форме boost::ptr_container классы.

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

2
ответ дан 30 November 2019 в 07:09
поделиться

Когда я в последний раз протестировал с VC6, компилятор не смог оптимизировать код с интеллектуальным указателем, а также он мог с необработанным указателем. Вещи, возможно, изменились с тех пор.

2
ответ дан 30 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

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