Моя предыдущая версия, в то время как не ложь, была быстро записанным упрощением.
Изменение от 32 до 64 битов автоматически не сделает Ваше выполнение приложения быстрее, это может в некоторых случаях привести к противоположному. На "отрицательной" стороне, Делающей разыменование указателей памяти в JVM, может занять более длительное время с указателями на 64 бита, чем 32 бита. Полное собирает "мусор", и уплотнение "кучи" на 16 ГБ, вероятно, займет более длительное время, чем с "кучей" на 2 ГБ.
На положительной стороне: Там инструкции по процессору на 64 бита, которые являются более эффективными, чем на 32 бита. JVM на 64 бита позволит Вам иметь размер "кучи" 2^32 времена, больше, чем, немного меньше, чем, 4 ГБ один, можно добраться с 32 битами. (Если можно позволить себе купить ту сумму RAM), Некоторый JVMs может работать со сжатыми ссылками, если у Вас есть размер "кучи" меньше чем 4 ГБ, давая Вам преимущество инструкций на 64 бита, не имея необходимость платить 64 бита, разыменовывающие цену.
, Если бы у Вас есть хорошая JVM, я перешел бы к 64 битам, неважно, размер "кучи", просто был бы подготовлен, что Вам, вероятно, придется получить удар производительности для того, чтобы иметь действительно большую "кучу".
Вот способ. Возможно, он не самый лучший, но он работает: strike>
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
должен быть более сложным, чем ваш пример, вы можете столкнуться с проблемами, но это гораздо проще, чем все, что я смог придумать.
С лямбдой из 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)); });
}
Могут ли компиляторы по-прежнему встроить вызовы, если они сделаны через указатели функций?
Они могут, но это действительно сложнее, и они могут выходить из строя чаще, чем с помощью функтора или шаблона.