You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rust实现带匿名结构体的C++ Union等价功能?

Rust 中等价于 C++ 位域 union 的实现方案

Rust 没有 C++ 那样直接支持匿名位域结构体嵌入 union 的语法,但可以通过两种方式实现等价功能,适配 CPU 模拟器的位段拆分需求:

一、手动位操作(推荐,安全无依赖)

这种方式不需要 unsafe 代码,跨平台行为明确,适合需要精确控制位操作的场景:

#[derive(Debug, Clone, Copy)]
struct Example {
    full_value: u32,
}

impl Example {
    // 获取低16位(对应C++的sixteen1)
    fn sixteen1(&self) -> u16 {
        (self.full_value & 0xFFFF) as u16
    }

    // 获取高16位(对应C++的sixteen2)
    fn sixteen2(&self) -> u16 {
        ((self.full_value >> 16) & 0xFFFF) as u16
    }

    // 获取低3位(对应C++的three)
    fn three(&self) -> u8 {
        (self.full_value & 0b111) as u8
    }

    // 获取高29位(对应C++的twentynine)
    fn twentynine(&self) -> u32 {
        self.full_value >> 3
    }
}

fn main() {
    let e = Example { full_value: 12345678 };
    println!("{} {} {} {}", e.sixteen1(), e.sixteen2(), e.three(), e.twentynine());
}

这种方案的优势是完全可控,不存在平台 ABI 差异导致的布局问题,代码可读性也强,非常适合 CPU 模拟器开发。

二、Unsafe Union 实现(接近C++语法)

如果需要更贴近 C++ 的 union 位域写法,可以用 Rust 的union配合#[repr(C)]标注,强制和 C++ 的内存布局一致,但必须使用 unsafe 代码(因为访问 union 的非活跃成员属于未定义行为):

#[repr(C)]
union Example {
    full_value: u32,
    sixteen_parts: SixteenParts,
    three_parts: ThreeParts,
}

#[repr(C)]
struct SixteenParts {
    sixteen1: u16, // 小端平台下对应C++的低16位位域
    sixteen2: u16,
}

#[repr(C)]
struct ThreeParts {
    three: u32: 3,
    twentynine: u32: 29,
}

fn main() {
    unsafe {
        let mut e = Example { full_value: 12345678 };
        let sixteen = e.sixteen_parts;
        let three = e.three_parts;
        println!("{} {} {} {}", sixteen.sixteen1, sixteen.sixteen2, three.three, three.twentynine);
    }
}

注意:位域的内存布局依赖目标平台的 ABI(比如位的分配顺序),需要确保和你的 C++ 代码运行平台一致;另外,unsafe 代码需要谨慎使用,避免出现未定义行为。

内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:36:26