История изменений
Исправление fsb4000, (текущая версия) :
Если мы гарантируем компилятору что в CallMe2 не передадут nullptr, то он генерирует одинаковый код (насколько это возможно в силу разного размера указателя и std::function)
CallMe1(void (*)()):
jmp rdi
CallMe2(std::function<void ()>):
jmp [QWORD PTR [rdi+24]]
void CallMe1(FuncType1 func1)
{
func1();
}
void CallMe2(FuncType2 func2)
{
if(!func2) {
__builtin_unreachable();
}
func2();
}
Исправление fsb4000, :
Если мы гарантируем компилятору что в CallMe2 не передадут nullptr, то он генерирует одинаковый код (насколько это возможно в силу разного размера указателя и std::function)
CallMe1(void (*)()):
jmp rdi
CallMe2(std::function<void ()>):
jmp [QWORD PTR [rdi+24]]
Исходная версия fsb4000, :
Если мы гарантируем компилятору что в CallMe2 не передадут nullptr, то он генерирует одинаковый код
CallMe1(void (*)()):
jmp rdi
CallMe2(std::function<void ()>):
jmp [QWORD PTR [rdi+24]]