小编Jer*_*hma的帖子

在编译时计算“const char *”字符串哈希

我有一个计算字符串文字的哈希值的函数:

inline consteval uint64_t HashLiteral(const char* key)
{
   // body not important here...
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

在另一个函数中,我需要文字字符串及其哈希值,我想在编译时计算它:

void function(const char* s)
{
   worker(s, HashLiteral(s));
}
Run Code Online (Sandbox Code Playgroud)

然而,似乎不可能进行这样的调用function("string"),并在编译时在其主体中计算哈希值。我现在想到的最好方法是使用宏,并重新定义函数:

#define MakeHashParms(s)   s,HashLiteral(s)
void function(const char* s, const uint64_t hash)
{
   worker(s, hash);
}
function(MakeHashParms("string"));
Run Code Online (Sandbox Code Playgroud)

是否可以有更直接的解决方案?

c++ constexpr consteval

5
推荐指数
1
解决办法
177
查看次数

当构造函数不存在时,析构函数被省略?

下面的代码重现了我遇到的问题,MSVC 2022:

#include <iostream>

struct A {
    static void message()
    {
        std::cout << "A::message()\n";
    }

    struct B {
        B() {}
        ~B()
        {
            A::message();
        }
    };

    static inline B b;
};
 
int main()
{
}
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,我看到如预期的那样出现了消息。然而:

  1. 如果我删除 constructor B(),那么析构函数~B()似乎被删除,因为消息消失了。
  2. 如果我随后int dummy;向结构添加一个虚拟属性B,则该消息会再次出现。

我确实找不到答案的问题:

  1. 在我看来,如果没有构造函数B(),也没有属性B,编译器只是将类标记B为空,然后完全跳过它。它是否正确?
  2. 是否有记录表明这种情况可能发生?鉴于析构函数的内容,我认为这永远不会发生。
  3. 我怎样才能保证它始终正常工作,而不仅仅是我现在使用的编译器。定义构造函数是否B()足够,或者我还应该使用B虚拟属性使其非空int dummy;

c++ constructor destructor

1
推荐指数
1
解决办法
91
查看次数

标签 统计

c++ ×2

consteval ×1

constexpr ×1

constructor ×1

destructor ×1