在C++中是否将额外字节初始化为0?

Ant*_*rez 7 c++ memory initialization

假设我有一个包含int和char的结构:

struct thing_t {
    int value = 0;
    char other_value = 0;
};
Run Code Online (Sandbox Code Playgroud)

由于事物在内存中对齐的方式,sizeof(thing_t)应该是8,因为最大成员的大小是4个字节.如果我创建一个默认初始化的实例thing_t,那么额外的3个字节是否会被初始化为0?

我认识到这通常不会出现,但我正在编写一个哈希函数,哈希函数的默认行为是散列泛型类型,就像它是一个字节数组一样.如果额外的字节偶尔没有初始化为0,我意识到我的方法可能会导致问题.

R S*_*ahu 5

我在 C++11 标准中找不到任何有关默认初始化对象时填充会发生什么情况的内容。

\n

然而,当涉及到零初始化时,标准对于填充是严格的。

\n

8.5 初始化程序/5

\n
\n

5.2 \xe2\x80\x94 如果 T 是(可能是 cv 限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都初始化为零,并且填充初始化为零位;

\n

5.3 \xe2\x80\x94\nif T 是(可能是 cv 限定的)联合类型,则对象的第一个非静态命名数据成员初始化为零,并且填充初始化为零位;

\n
\n

我建议使用零初始化而不是默认初始化来强制填充位初始化为零。这将导致您的哈希函数产生可预测的值。

\n