2015-05-22 29 views
1

假設我有一個用戶定義的文字,其將被用來計算一個char []的哈希碼在編譯時間:是否有可能使C++ 11用戶定義的文字被刪除?

constexpr unsigned operator "" _hash(const char * pStr, std::size_t length) 
{ 
    // Some code here 
} 

而且我可以使用它像:

unsigned hash = "Hello"_hash; 
std::cout << hash; 

我只想將hash code保留在我的二進制文件中,並將"Hello"取出,因爲在計算散列值後它沒用了。如何實現這一目標?

+0

'constexpr unsigned hash = ...'? –

回答

0

不需要採取特別措施。編譯器會注意到,在優化階段該值未被使用,並將其去除。

確保您使用-O1或更高版本進行編譯,並且您不應該在二進制文件中看到「Hello」彈出。

經GCC 4.9.2測試。

+0

謝謝。 '-O1'做到了訣竅。我使用了鏗鏘聲,我認爲我也需要'-dead_strip'。調試: – jayatubi

0
constexpr ULONG GenHashTableValue(CONST INT C, USHORT Hi, USHORT Lo, ULONG Seed = 0x00100001) { 
    return C == 0 ? (Hi << 0x10) | Lo : (
    Seed = (Seed * 125 + 3) % 0x2aaaab, 
      Hi = Seed & 0xffff, 
      Seed = (Seed * 125 + 3) % 0x2aaaab, 
      Lo = Seed & 0xffff, 
      GenHashTableValue(C - 1, Hi, Lo, Seed) 
      ); 
} 


constexpr ULONG Index2Count(ULONG N) { 
    return GenHashTableValue(N/0x100 + (N % 0x100) * 5 + 1, 0, 0); 
} 

constexpr ULONG HashInternal(const void* Data, const SIZE_T Size, HashType HashType, ULONG Seed1 = HashSeed1, ULONG Seed2 = HashSeed2) { 
    return Size == 0 ? Seed1 
    : (Seed1 = Index2Count((HashType << 8) + ToUpper(Data))^(Seed1 + Seed2), 
     Seed2 = ToUpper(Data) + Seed1 + Seed2 + (Seed2 << 5) + 3, 
     HashInternal((PUCHAR)Data + 1, Size - 1, HashType, Seed1, Seed2)); 
} 

// utf8 string 
constexpr ULONG operator "" _hashO(const char* Str, size_t Size) { 
    return HashInternal(Str, Size, HashOffset); 
} 

vc2015使用mpq散列。

+0

:enum {name = u8「1234」_hashO} – lovelyidiot

相關問題