LINUX.ORG.RU

История изменений

Исправление 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();
}

https://godbolt.org/z/8j4Pd7hnr

Исправление fsb4000, :

Если мы гарантируем компилятору что в CallMe2 не передадут nullptr, то он генерирует одинаковый код (насколько это возможно в силу разного размера указателя и std::function)

CallMe1(void (*)()):
        jmp     rdi
CallMe2(std::function<void ()>):
        jmp     [QWORD PTR [rdi+24]]

https://godbolt.org/z/8j4Pd7hnr

Исходная версия fsb4000, :

Если мы гарантируем компилятору что в CallMe2 не передадут nullptr, то он генерирует одинаковый код

CallMe1(void (*)()):
        jmp     rdi
CallMe2(std::function<void ()>):
        jmp     [QWORD PTR [rdi+24]]

https://godbolt.org/z/8j4Pd7hnr