inline void add(const DataStruct& rhs) {
using namespace boost::assign;
vec.reserve(vec.size() + 3);
vec += rhs.a, rhs.b, rhs.c;
}
выше функция была выполнена в течение приблизительно 17 000 раз, и это выполняется (насколько я могу видеть. Был некоторое преобразование участие) около 2 магнитуды хуже с ВЫЗОВ МАСТЕРА к вектору ::.станд :: вектор :: резерв снижения производительности
У меня всегда было впечатление, что резерв может ускорить push_back даже для небольших значений, но это не кажется правдой, и я не могу найти никаких очевидных причин, почему это не должно быть так. Сохраняет ли резерв возможность встраивания функции? Является ли вызов size() слишком дорогим? Это зависит от платформы? Я попытаюсь составить код небольшого теста, чтобы подтвердить это в чистой среде.
Компилятор: gcc (GCC) 4.4.2
с -g -O2
Вы пытались зарезервировать место для 17000 * 3 входа? Могут быть некоторые накладные расходы с вашим дополнительным вызовом функции, что может объяснить разницу. – int3
@splicer: Число было связано с testdata. Фактическое количество вызовов является переменной. – pmr
моя точка зрения заключалась в том, что то, что вы делаете, эффективнее только с большими числами. Ответ Джеймса Шека дает вам возможность сделать это с помощью переменного количества вызовов, если вы знаете, с чего начать. в противном случае вам лучше разрешить реализацию по умолчанию для вас. – int3