Чтобы красиво было и понятно. Тогда и работает лучше. Тут:
return CRC( (uint8_t*) &my_const , 4); // в функцию передается константа, а не ее адрес
дело может быть в том, что CRC() в нескольких местах вызывается с длиной данных 4. И компилятор мог оптимизировать саму функцию CRC() так, что она, де-факто, принимает 32-битные значения вместо указателей и во всех вызовах этой реализации (не исключаю, что для других мест будет другая реализация, если приоритет на оптимизацию скорсти) функции ей передаётся именно значение.
Если же реализация только одна, один экземпляр в машинном коде, то передача то адреса, то значения вперемешку - действительно баг. Тут, пораскинув мозгами, согласен.
P.S. Объяснение с какой целью делать тут (внимание, рекурсия!):
http://caxapa.ru/919437.html