Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
и теперь он не заставляет заниматься процессоры пользователей ненужной работой, позволяя их ноутбукам работать от батареи чуточку дольшеКак проводились измерения, и насколько выраженной получилась экономия энергии?
В таком случае, декларируемые преимущества не слишком значительны.А руководство такой задачи мне и не ставило) решить её мне захотелось, потому что в своё время я уже сталкивался с такой проблемой, и тогда приходилось пользоваться внешним кодогенератором.
А значительное раздувание кода в дебаге кажется мне заметным недостатком.В дебаге используется ifdef, по которому включается старая реализация.
include "StdAfx.h"
template< int >
inline __int32 crc32( const char *s )
{
static __int32 crc = 42; // insert crc calculation here
return crc;
}
#define CRC32( STRING ) crc32< __COUNTER__ >( STRING )
void main ()
{
std::cout << CRC32( "a" ) << std::endl;
std::cout << CRC32( "b" ) << std::endl;
}
А вы уверены, что уже сейчас у вас нету коллизий? может их просто не заметили, и где-то выдаются неправильные сообщения?это легко проверить, ровно один раз — в момент добавления строк в языковой пакет.
constexpr uint32_t CalcCRC32Impl(uint32_t prevCrc, const char* str)
{
return !(*str) ? prevCrc : CalcCRC32Impl((prevCrc >> 8) ^ Crc32Table[(prevCrc ^ *str) & 0xff], str + 1);
}
constexpr unsigned int CalcCRC32(const char* str)
{
return CalcCRC32Impl(0xffffffff, str) ^ 0xffffffff;
}
template<int crc>
void PrintCrc()
{
std::cout << crc << std::endl;
}
PrintCrc<CalcCRC32("123")>();
После внедрения кода в проект, компиляция релизной сборки стала дольше на 1-2 минуты, но зато бинарник стал легче на 200 Кб
Вычисление CRC32 строк в compile-time