最近我试图利用MSVC 2015下的C++ 0x constexpr,我的目标是实现编译时哈希字符串.我编写了一个简单的FNV-1a哈希算法作为constexpr函数,根据需要使用单个return语句(三元运算符)并仅调用constexpr函数,这里它是:
template <size_t N>
constexpr U32 StringID_FNV1a_32(const char(&str)[N], I32 charIndex = 0, U32 hash = 2166136261U)
{
return charIndex < N-1 ? StringID_FNV1a_32(str, charIndex +1, (hash ^ str[charIndex]) * 16777619U) : hash;
}
Run Code Online (Sandbox Code Playgroud)
我还做了一个小宏,能够毫不费力地改变引擎盖下的算法:
#define STRING_ID(str) core::utility::StringID_FNV1a_32(str)
Run Code Online (Sandbox Code Playgroud)
然后我在我的代码中使用了这个宏,仔细检查是否有任何断点被击中,以及生成的汇编代码.这是小情景:
//1. normal variable test
U32 hash1 = STRING_ID("abc");
//2. enum test
enum {
hash2 = STRING_ID("abc")
};
//3. constexpr variable test
constexpr U32 hash3 = STRING_ID("abc");
Run Code Online (Sandbox Code Playgroud)
这里有事实:
你可以想象我对第一次和第三次尝试感到有些困惑.
为什么在第三种情况下允许编译器在运行时调用该函数?即使msdn明确说明"const和constexpr变量之间的主要区别在于const变量的初始化可以推迟到运行时,而constexpr变量必须在编译时初始化." [ https://msdn.microsoft.com/it-it/library/dn956974.aspx#Anchor_3] …
如何在不使用任何字符串类(例如or但仅使用纯数组和文字字符串)的情况下std::codecvt_utf8_utf16从 uft8 转换为 utf16 并返回?我如何知道存储转换所需的缓冲区的正确大小?std::stringstd::wstring
比如满足这个接口:
std::unique_ptr<char16_t[]> ToUTF16(const char* utf8String);
std::unique_ptr<char[]> ToUTF8(const char16_t* utf16String);
Run Code Online (Sandbox Code Playgroud) c++11 ×2
c++ ×1
compile-time ×1
constexpr ×1
hash ×1
unicode ×1
utf-16 ×1
utf-8 ×1
visual-c++ ×1