Шаблонная функция как аргумент шаблона

Моя предыдущая версия, в то время как не ложь, была быстро записанным упрощением.

Изменение от 32 до 64 битов автоматически не сделает Ваше выполнение приложения быстрее, это может в некоторых случаях привести к противоположному. На "отрицательной" стороне, Делающей разыменование указателей памяти в JVM, может занять более длительное время с указателями на 64 бита, чем 32 бита. Полное собирает "мусор", и уплотнение "кучи" на 16 ГБ, вероятно, займет более длительное время, чем с "кучей" на 2 ГБ.

На положительной стороне: Там инструкции по процессору на 64 бита, которые являются более эффективными, чем на 32 бита. JVM на 64 бита позволит Вам иметь размер "кучи" 2^32 времена, больше, чем, немного меньше, чем, 4 ГБ один, можно добраться с 32 битами. (Если можно позволить себе купить ту сумму RAM), Некоторый JVMs может работать со сжатыми ссылками, если у Вас есть размер "кучи" меньше чем 4 ГБ, давая Вам преимущество инструкций на 64 бита, не имея необходимость платить 64 бита, разыменовывающие цену.

, Если бы у Вас есть хорошая JVM, я перешел бы к 64 битам, неважно, размер "кучи", просто был бы подготовлен, что Вам, вероятно, придется получить удар производительности для того, чтобы иметь действительно большую "кучу".

31
задан Kos 15 January 2011 в 00:01
поделиться

2 ответа

Вот способ. Возможно, он не самый лучший, но он работает:

template <typename T, T param>
void function() {
    param(123);
    param(456);
}

void test()
{
    function< void(*)(int), a<int> >(); // space at end necessary to compiler
    function< void(*)(int), b<int> >(); // because the C++ grammar is ambiguous
}

Будет ли они встроены, зависит от компилятора, но я был бы весьма удивлен, если бы они не были.

РЕДАКТИРОВАТЬ: Ладно, я сегодня немного ушел и пропустил ту часть, где параметры разных типов. Мой плохой.

Может быть хитрый способ сделать это с помощью шаблонов, но это самый простой способ, о котором я мог подумать:

#define function(x) do { x<thing1>(obj1); x<thing2>(obj2) } while(0)

Я знаю, я знаю, «макросы злые», бла-бла-бла , Оно работает. Если function должен быть более сложным, чем ваш пример, вы можете столкнуться с проблемами, но это гораздо проще, чем все, что я смог придумать.

0
ответ дан 27 November 2019 в 22:44
поделиться

С лямбдой из C ++ 11 вы могли бы сделать:

template<typename T> void a(T t) { /* do something */}
template<typename T> void b(T t) { /* something else */ }

template <typename F>
void function(F&& f) {
    f(someobj);
    f(someotherobj);
}

void test() {
    // For simple cases, auto&& is even probably auto or const auto&
    function([](auto&& t){ a(t); });
    function([](auto&& t){ b(t); });

    // For perfect forwarding
    function([](auto&& t){ a(std::forward<decltype(t)>(t)); });
    function([](auto&& t){ b(std::forward<decltype(t)>(t)); });
}

Могут ли компиляторы по-прежнему встроить вызовы, если они сделаны через указатели функций?

Они могут, но это действительно сложнее, и они могут выходить из строя чаще, чем с помощью функтора или шаблона.

2
ответ дан 27 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

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