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
Susan Sarandonasal
2024-12-02 22:42:10535semak imbas

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;
   }
}

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!

Kenyataan:
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