首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使msvc 14在编译时评估我的同事

如何使msvc 14在编译时评估我的同事
EN

Stack Overflow用户
提问于 2016-08-03 16:06:09
回答 1查看 666关注 0票数 1

我正在用c++ constexpr做实验。我正在使用FNV-1a哈希实现一个HashedString类。

除了VisualStudio2015UPDATE 3似乎没有在编译时评估constexpr之外,一切看起来都很好。

我添加了一个static_assert,它没有显示错误,但是在我的测试的反汇编中,很明显是对constexpr函数的显式调用,而不是预先计算出来的值。

我也尝试过使用g++和clang,它们都能够在编译时评估constexpr

这是我的测试代码:

代码语言:javascript
复制
#include <cstdint>
#include <cstddef>
#include <string>

class HashedString {
public:

//value working only for a 32bit hash
constexpr static size_t defaultOffset = 2166136261u;
constexpr static size_t prime = 16777619u;

/**
* Compute the hash of a string at compile time using FNV-1a hash
* https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80   %93Vo_hash_function
*/
template<std::size_t N>
constexpr HashedString(const char(&a)[N]) noexcept
    : mHash(hash(a))
#if defined(_DEBUG)
    , mString(a)
#endif
{
}
explicit constexpr HashedString(size_t h) noexcept : mHash(h) {}

constexpr static size_t hash(const char *const aString, const uint32_t val = defaultOffset) noexcept
{
    return (aString[0] == '\0') ? val : hash(&aString[1], (val ^ uint32_t(aString[0])) * prime);
}

constexpr bool operator==(const HashedString & hs) const { return mHash == hs.mHash; }
constexpr bool operator==(const size_t & h) const { return mHash == h; }
constexpr bool operator!=(const HashedString & hs) const { return mHash != hs.mHash; }
constexpr bool operator!=(const size_t & h) const { return mHash != h; }
constexpr bool operator<(const HashedString & hs) const { return mHash < hs.mHash; }

private:
    const size_t mHash = 0;
#if defined(_DEBUG)
    const char* mString = nullptr;
#endif
};

static_assert(HashedString("FNV Hash Test") == 0xF38B3DB9, "HashedString of 'FNV Hash Test' shoulb be equal to 0xF38B3DB9");

int main(int , char**) {
    constexpr HashedString hs("FNV Hash Test");
    return hs == 0xF38B3DB9;
}

所以我的问题是:是否有一种方法可以让visual在编译时计算我的constexpr

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-03 17:19:27

主要改为:

代码语言:javascript
复制
constexpr auto hash = HashedString::hash("FNV Hash Test");
return hash == 0xF38B3DB9;

代码语言:javascript
复制
constexpr HashedString hs("FNV Hash Test");
constexpr auto answer = hs == 0xF38B3DB9;
return answer;

将导致在编译时计算哈希。按照代码的方式,编译器不需要在编译时计算哈希。通过要求编译器初始化一个constexpr变量,它被迫在编译时计算该值。它将main的代码简化为:

代码语言:javascript
复制
mov eax,1
ret

哇哦!对于SSA 2015的SSA优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38748626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档