Rumah >pembangunan bahagian belakang >C++ >Bolehkah C Compile-Time String Hashing Dicapai Dengan Cekap?
Bolehkah Pencincangan Rentetan Dilakukan pada Masa Penyusunan?
Dalam C 11, spekulasi timbul mengenai kebolehlaksanaan mengira cincang rentetan pada masa penyusunan menggunakan literal rentetan baharunya.
Operator Sintaks
Khusus sintaks pengendali untuk melaksanakan pencincangan rentetan masa kompilasi masih tidak jelas. Contoh kod yang dicadangkan yang mempamerkan kes penggunaannya menunjukkan bahawa pengendali mungkin menyerupai "std::hash(value)" fiksyen yang ditunjukkan di bawah:
void foo(const std::string& value) { switch( std::hash(value) ) { case "one"_hash: one(); break; case "two"_hash: two(); break; /*many more cases*/ default: other(); break; } }
Cabaran Pelaksanaan
Walaupun terdapat kenyataan suis yang jelas, terdapat halangan pelaksanaan yang perlu diatasi. Rentetan malar dalam C 11 ialah const char* dan bukan std::strings. Ini memerlukan langkah penukaran tambahan, yang berpotensi menghalang kecekapan.
Pelaksanaan Berjaya
Pelaksanaan terobosan fungsi CRC32 masa kompilasi telah dicapai menggunakan constexpr, tetapi ia terhad kepada GCC penyusun pada masa ini. Pelaksanaan ini memanfaatkan jadual CRC32 dan fungsi constexpr rekursif untuk mengira cincang:
constexpr uint32_t crc32(const char * str, size_t idx = 0) { return (crc32(str, idx-1) >> 8) ^ crc_table[(crc32(str, idx-1) ^ str[idx]) & 0x000000FF]; } constexpr uint32_t crc32(const char * str, size_t(-1)) { return 0xFFFFFFFF; } #define COMPILE_TIME_CRC32_STR(x) (crc32(x) ^ 0xFFFFFFFF)
Menggunakan pelaksanaan ini, seseorang boleh mengira cincangan CRC32 masa kompilasi bagi rentetan seperti:
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
Ini memberikan nilai 0x335CC04A kepada CrcVal01, menunjukkan aplikasi praktikal pencincangan rentetan masa kompilasi.
Atas ialah kandungan terperinci Bolehkah C Compile-Time String Hashing Dicapai Dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!