C++ Unions Internals

Dav*_*ten 1 c++ unions

我正在尝试学习早期的C++并在国际象棋程序中遇到一些我需要帮助理解的代码.我有一个工会,如:

union b_union {

    Bitboard b;
    struct {
    #if defined (BIGENDIAN)
        uint32_t h;
        uint32_t l;
    #else
        uint32_t l;
        uint32_t h;
    #endif
    } dw;
};
Run Code Online (Sandbox Code Playgroud)

上面的代码属于其他条件.

位板定义为uint64_t.如果我有一个值,假设为0x0025f780,即282578800148862,并且我设置了union.b = 0x0025f780,则union.dw.l更新为16843134,union.dw.h更新为65793.最初l和h开始于3435973836.在内部,发生了什么?我对C++很新.试着在工会内部如何工作时尽力绕过工会.

非常感谢任何见解.

大卫

Mys*_*ial 5

联合意味着组件将占用相同的内存位置.在您显示的代码示例中,目的是允许您直接引用上下32位b.

请注意,此代码调用未定义(或实现定义)行为.这是因为您正在从写入数据的其他元素访问union元素.

因此b,这是一个64位整数,将共享相同的内存位置,lh指向低32位和高32位.当然,这的有效性取决于机器的endian - 这就是为什么有预处理器if-else.

编辑:你的具体例子也不正确.但这是一个固定的版本:

当你设置b = 282578800148862,(b = 0x101010101017e).上下32位是:

00010101 0101017e
Run Code Online (Sandbox Code Playgroud)

所以

l = 0x0101017e = 16843134
h = 0x00010101 = 65793
Run Code Online (Sandbox Code Playgroud)