Rumah > pembangunan bahagian belakang > C++ > Bolehkah C Compile-Time String Hashing Dicapai Dengan Cekap?

Bolehkah C Compile-Time String Hashing Dicapai Dengan Cekap?

Susan Sarandon
Lepaskan: 2024-12-02 22:42:10
asal
590 orang telah melayarinya

Can C   Compile-Time String Hashing Be Achieved Efficiently?

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;
   }
}
Salin selepas log masuk

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)
Salin selepas log masuk

Menggunakan pelaksanaan ini, seseorang boleh mengira cincangan CRC32 masa kompilasi bagi rentetan seperti:

enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan