为什么顶尖工程师都在用std::variant代替union?真相来了

第一章:从union到std::variant的演进之路

在C++的发展历程中,数据类型的表达能力不断进化。早期的C语言提供了union机制,允许多个不同类型的变量共享同一段内存。然而,union缺乏类型安全检查,程序员必须手动管理当前激活的成员,极易引发未定义行为。

传统union的局限性

union Value {
    int i;
    double d;
    char c;
};
上述代码定义了一个可存储整数、浮点数或字符的联合体,但编译器无法判断当前哪个成员有效。访问错误成员会导致不可预测的结果。为解决此问题,通常需配合一个标签字段使用:
  • 定义枚举标识当前类型
  • 手动维护类型标签与union的一致性
  • 易出错且难以维护

现代替代方案:std::variant

C++17引入了std::variant,作为类型安全的联合体替代品。它能自动管理内部对象的生命周期,并提供访问接口:
#include <variant>
#include <string>

using VarType = std::variant<int, double, std::string>;

VarType v = 3.14;
v = std::string{"Hello"}; // 安全地切换类型
std::variant通过异常机制(如std::bad_variant_access)保障访问安全,并支持std::visit进行类型分发:
特性unionstd::variant
类型安全无有
构造/析构不自动调用自动管理
标准支持C语言继承C++17起
这一演进显著提升了代码的健壮性和可维护性,使多类型持有成为安全实践。

第二章:union的局限与风险剖析

2.1 C风格union的内存共享机制解析

C语言中的union(联合体)是一种特殊的数据结构,其所有成员共享同一块内存空间。这意味着union的大小等于其最大成员所占的字节数。
内存布局示例

union Data {
    int i;
    float f;
    char str[8];
};
上述union的大小为8字节(由char str[8]决定),三个成员共用起始地址相同的内存区域。当向i写入整数值后,再读取f将解释同一内存为浮点格式,可能导致数据误读。
典型应用场景
  • 节省内存:在嵌入式系统中用于紧凑存储不同类型的数据
  • 类型双关(type punning):通过不同成员访问同一数据的二进制表示
内存对齐与安全
成员类型偏移量占用字节
int04
float04
char[8]08
所有成员从地址0开始,实际使用时需程序员自行管理当前有效成员,避免未定义行为。

2.2 类型安全缺失导致的未定义行为

类型系统是程序正确性的第一道防线。当类型安全机制被绕过或设计不当时,极易引发未定义行为。
类型混淆的典型场景
在弱类型或类型检查不严格的语言中,不同类型的数据可能被错误地解释。例如,在C语言中通过指针强制转换可绕过类型系统:

int main() {
    double d = 3.14;
    int *p = (int*)&d;        // 类型转换绕过类型检查
    printf("%d\n", *p);       // 未定义行为:读取double的内存解释为int
    return 0;
}
上述代码将 double 类型的地址强制转换为 int*,解引用时会读取不符合目标类型对齐和大小要求的内存,导致不可预测的结果。
常见后果与防护建议
  • 内存访问越界
  • 数据解释错误
  • 程序崩溃或安全漏洞(如缓冲区溢出)
应优先使用静态类型语言,并避免低级别的类型双关操作,以保障类型完整性。

2.3 手动管理活跃成员的复杂性实践

在分布式系统中,手动维护节点的活跃状态极易引入人为错误和延迟。随着集群规模扩大,运维人员需频繁通过命令行或配置文件更新成员列表。
常见操作流程
  • 通过 SSH 登录控制节点
  • 编辑成员配置文件(如 members.conf)
  • 重启服务以应用变更
典型配置示例
node1.example.com:8080 ACTIVE
node2.example.com:8080 PENDING
node3.example.com:8080 INACTIVE
上述配置需手动同步至所有协调节点,缺乏一致性校验机制,易导致脑裂。
问题分析
人工干预 → 配置延迟 → 状态不一致 → 故障转移失败
该流程暴露了可扩展性和容错性的根本缺陷,促使团队转向自动化的成员发现机制。

2.4 union在现代C++中的使用陷阱

非POD类型的管理风险
在C++11之后,union支持包含具有构造函数、析构函数的类类型,但程序员必须手动管理活跃对象的生命周期。若未正确跟踪当前活跃成员,将导致未定义行为。
union Value {
    int i;
    std::string s;
    Value() : i(0) {}
    ~Value() {} // 不会自动调用std::string的析构函数
};
上述代码中,若向 s 赋值后未显式调用其析构函数,程序将发生内存泄漏或崩溃。
类型安全与变体替代方案
由于 union 缺乏内建的类型标签,易引发误读。现代C++推荐使用 std::variant 替代:
  • 类型安全:std::variant 明确记录当前存储的类型;
  • 异常安全:自动管理资源;
  • 访问安全:结合 std::visit 可避免非法访问。

2.5 典型bug案例分析与调试困境

异步竞态导致的数据错乱
在高并发场景下,多个goroutine同时修改共享变量而未加锁,极易引发数据竞争。例如以下Go代码:
var counter int
for i := 0; i < 1000; i++ {
    go func() {
        counter++ // 未同步操作
    }()
}
该代码因缺乏互斥机制,最终counter值远小于预期。使用-race标志可检测到数据竞争,但生产环境中往往难以复现。
调试常见困境
  • 日志缺失导致上下文信息不足
  • 分布式调用链路断裂,无法追踪源头
  • 临时性故障难以稳定复现
引入结构化日志与分布式追踪系统(如OpenTelemetry)可显著提升问题定位效率。

第三章:std::variant的核心特性与优势

3.1 类型安全的多态存储设计原理

在现代系统架构中,类型安全的多态存储通过统一接口管理异构数据类型,同时确保编译期类型正确性。其核心在于利用泛型与接口隔离数据操作与具体实现。
设计模式结构
  • 定义通用存储接口,约束操作契约
  • 使用类型参数约束实现多态写入
  • 运行时动态分发,编译时静态检查
type Storage[T any] interface {
    Put(key string, value T) error
    Get(key string) (T, bool)
}
上述代码定义了泛型存储接口,T 为类型参数,确保不同实体共用同一抽象。Put 方法接收指定类型值,Get 返回对应类型实例与存在标志,编译器可校验类型一致性,避免运行时类型错误。
类型擦除与恢复机制
通过类型标记(Type Tag)与反射元数据,在序列化时保留类型信息,反序列化时精准重建原始类型实例,保障跨存储边界的数据完整性。

3.2 编译时类型检查与运行时状态管理

现代编程语言通过编译时类型检查提升代码可靠性。以 Go 为例,静态类型系统在编译阶段捕获类型错误:

var age int = 25
// age = "twenty-five" // 编译错误:不能将字符串赋值给 int 类型
该代码在编译期即验证变量类型一致性,避免运行时因类型错乱导致的崩溃。
运行时状态的安全管理
尽管类型在编译时确定,运行时仍需管理可变状态。使用不可变数据结构和同步机制可降低副作用风险。
  • 通过接口隔离变化,增强模块稳定性
  • 利用闭包封装私有状态,防止外部误修改
  • 结合通道或锁机制协调并发访问
类型系统与状态控制协同工作,构建高可信度应用。

3.3 std::visit与访问者模式的高效结合

在现代C++中,`std::variant` 与 `std::visit` 的组合为实现类型安全的访问者模式提供了简洁高效的解决方案。通过 `std::visit`,可以在运行时对变体类型中的不同可能类型执行多态操作,而无需继承或虚函数。
基本用法示例

#include <variant>
#include <iostream>

using Value = std::variant<int, double, std::string>;

struct PrintVisitor {
    void operator()(int i) const { std::cout << "整数: " << i << '\n'; }
    void operator()(double d) const { std::cout << "浮点: " << d << '\n'; }
    void operator()(const std::string& s) const { std::cout << "字符串: " << s << '\n'; }
};

Value val = 3.14;
std::visit(PrintVisitor{}, val); // 输出: 浮点: 3.14
上述代码定义了一个可持有整数、浮点或字符串的 `variant` 类型,并通过函数对象 `PrintVisitor` 实现对不同类型值的统一处理。`std::visit` 自动匹配当前存储的类型并调用对应的重载操作符。
优势分析
  • 类型安全:编译期检查所有可能类型的处理分支;
  • 性能优越:无虚函数开销,调用为内联优化提供可能;
  • 语义清晰:将数据结构与操作分离,符合单一职责原则。

第四章:std::variant实战应用指南

4.1 替代union实现安全的数值 variant 类型

在C++中,传统的union允许在同一内存位置存储不同类型的数据,但缺乏类型安全性。为避免未定义行为,推荐使用std::variant作为类型安全的替代方案。
std::variant 的基本用法
std::variant v = 3.14;
if (std::holds_alternative(v)) {
    double val = std::get(v);
    // 安全访问 double 值
}
上述代码定义了一个可持有 int、double 或 string 的 variant 变量。通过 std::holds_alternative 检查当前类型,再用 std::get 安全提取值,避免了 union 的类型误读问题。
错误处理与访问方式
  • 使用 std::get<T>(v) 直接获取值,若类型不匹配会抛出异常;
  • 推荐配合 std::visit 实现多态访问,支持泛型 lambda 处理不同类型。

4.2 构建状态机与错误处理的现代方案

在现代系统设计中,状态机与错误处理机制正逐步融合为统一的控制流范式。通过有限状态机(FSM)建模业务生命周期,可显著提升逻辑清晰度与可维护性。
声明式状态转换
使用 TypeScript 实现状态机的核心模式如下:

interface StateMachine<TState, TEvent> {
  currentState: TState;
  transition(event: TEvent): TState;
}

const orderMachine: StateMachine<'pending' | 'shipped' | 'cancelled', 'ship' | 'cancel'> = {
  currentState: 'pending',
  transition(event) {
    if (this.currentState === 'pending' && event === 'ship') return 'shipped';
    if (this.currentState === 'pending' && event === 'cancel') return 'cancelled';
    return this.currentState;
  }
};
上述代码定义了一个不可变的状态转换模型。每次调用 transition 方法时,根据当前状态和输入事件决定下一状态,避免了分散的条件判断。
错误边界与恢复策略
结合异常分类建立分级处理机制:
  • 瞬态错误:采用指数退避重试
  • 业务规则违例:触发状态回滚
  • 系统级故障:进入维护态并告警

4.3 与结构化绑定和if constexpr 的协同优化

现代C++中,结构化绑定与`if constexpr`的结合为泛型编程提供了强大的编译期优化能力。通过结构化绑定,可以轻松解包元组或结构体成员,而`if constexpr`则能在编译期根据类型特性选择执行路径。
编译期条件分支与数据解构
例如,在处理不同类型返回值时,可结合两者实现高效分发:

template <typename T>
void process(const T& data) {
    auto [x, y] = data; // 结构化绑定解包
    if constexpr (std::is_integral_v<decltype(x)>) {
        // 仅当x为整型时编译此分支
        std::cout << "Integer: " << x + y << std::endl;
    } else {
        std::cout << "Other: " << x << ", " << y << std::endl;
    }
}
上述代码中,`if constexpr`依据`x`的类型决定编译哪一分支,避免了运行时开销;结构化绑定简化了解包逻辑,提升可读性。二者协同减少了模板特化的冗余,增强了代码的通用性与性能。

4.4 性能对比测试与内存布局分析

在不同数据结构的性能评估中,内存布局对缓存命中率和访问延迟有显著影响。通过对比数组与链表在连续读取场景下的表现,可深入理解底层存储机制带来的差异。
测试环境与数据结构设计
测试基于Go语言实现,分别构建长度为1e6的整型数组和单向链表:

type Node struct {
    Value int
    Next  *Node
}
该链表节点分散分配,导致CPU缓存预取效率降低,而数组因连续内存布局具备更好的空间局部性。
性能指标对比
结构类型遍历耗时 (ms)内存占用 (MB)
数组2.17.6
链表15.816.0
数据显示,数组遍历速度快约7.5倍,主因是其内存连续性减少了Cache Miss。

第五章:迈向类型安全的C++工程实践

使用强类型枚举提升可读性与安全性
传统枚举存在作用域污染和隐式转换问题。C++11引入的强类型枚举(enum class)有效规避此类风险。

enum class LogLevel {
    Debug,
    Info,
    Warning,
    Error
};

void logMessage(LogLevel level, const std::string& msg) {
    switch (level) {
        case LogLevel::Info:
            std::cout << "[INFO] " << msg << std::endl;
            break;
        // ...
    }
}
// LogLevel level = 1; // 编译错误,杜绝隐式整型转换
静态断言与类型特征结合验证模板参数
在泛型编程中,利用 static_assert 与 std::is_arithmetic 等类型特征可在编译期拦截非法调用。
  • 确保模板仅接受数值类型,避免运行时逻辑错乱
  • 结合 SFINAE 或 Concepts(C++20)实现更复杂的约束
  • 错误信息清晰,定位问题高效
避免裸指针,优先使用智能指针语义化资源管理
指针类型适用场景类型安全优势
std::unique_ptr独占所有权自动释放,防止内存泄漏
std::shared_ptr共享所有权引用计数控制生命周期
std::weak_ptr打破循环引用避免悬挂指针
实战案例:重构遗留代码中的宏定义
将 #define MAX_USERS 100 替换为 constexpr int MaxUsers{100}; 不仅获得编译期常量特性,还支持类型检查与调试符号输出。
STM32F407通过SMBus协议精准读取BQ40Z50电池电量 本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。 阅读详情

相关推荐

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

c++ 学习之联合体union

union --联合体 特点:共享内存,长度由最大字节类型决定 例如: union data { short sHP; int iHP; double fHP; }; data在64位操作系统下就是8字节,由最长double决定 data user; std::cout << sizeof(data) << std::endl; 结果为...

航行的土豆的博客 347

STM32F4驱动ES8388音频芯片的I²S时钟与DMA流设计

I²S(Inter-IC Sound)是一种广泛应用于嵌入式音频系统的同步串行总线协议,其核心在于精确的时钟同步与稳定的数据流传输。理解I²S时钟树结构(含MCLK、SCLK、WS生成逻辑)和分频机制,是保障CD级音质(如44.1kHz/16bit)的基础;而DMA双缓冲技术则解决了实时音频播放中数据供给连续性的关键工程问题。在STM32F4等Cortex-M4平台中,需协同配置PLLI2S锁相环、I²S预分频寄存器(I2SxPR)及DMA循环模式,同时兼顾ES8388等Codec芯片的I²C初始化时序与寄

weixin_35390379的博客 244

C++ union共用体联合体用法大全_看这篇就够了

目录1. 背景2. union存在的必要性3. union的几种定义方式4. 数据成员内存覆盖的问题 1. 背景 关于union的知识点,教材和网上的资料都比较少,经过不断的查阅各种资料和测试,对union有了一些基本了解,这里进行整理,方便以后需要时查看 2. union存在的必要性 我们先来看下面的两段对比的代码,体验以下union的用处 #include <iostream> using namespace std; int main() { string name;

Bulut0907 8149

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 319

YOLOv9改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

这篇文章带来一个经典注意力模块的汇总,虽然有些模块已经发布很久了,但后续的注意力模块也都是在此基础之上进行改进的,对于初学者来说还是有必要去学习了解一下,以加深对模块,模型的理解。

Limiiiing的博客 2892

C++17类型std::variant介绍

C++17类型std::variant介绍。

fangfanglovezhou的博客 2566

华为OD机试 - 报文响应时间 - 贪心算法、位运算(Python/JS/C/C++ 2024 E卷 200分)

贪心算法是在每一步选择中都做出当前最优的选择,期望通过局部最优解推导出全局最优解的算法。

学Java,找哪吒 1758

C、C++中union用法总结

开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总

ny1986的专栏 4384

基于STM32、HAL库的MICRF112YMM-TR 无线收发器驱动程序设计

内部集成了 VCO、PLL、PA、LNA、混频器、滤波器等射频功能单元,极大减少了外部元件数量,降低了设计和布线难度。: 具有多种工作模式(睡眠、待机、接收、发射),待机电流极低,非常适合电池供电的物联网(IoT)设备。是 Microchip 公司生产的一款高性能、低功耗的单片 UHF ASK/FSK 收发器芯片。: 支持 ASK (幅移键控) 和 FSK (频移键控) 调制,适应不同应用需求。// 可以添加其他配置参数,如中心频率、数据速率等。智能家居(安防、遥控、传感)远程钥匙进入系统 (RKE)

corlin6688的博客 416

基于STM32L4XX、HAL库的 L76KB-A58定位模块驱动程序设计

/ 确保字符串终止。// 缓冲区溢出,重置。// 重置缓冲区索引。支持GPS、GLONASS、Galileo、北斗和QZSS多系统定位。case 1: // UTC时间。// 配置GPS模块(可选)// 查找GGA语句。// 启动UART接收。// USART1初始化函数。内置LNA和SAW滤波器。

zhusl6688的博客 349

C++关键字之——union

C++关键字之——union

StephenRay的博客 5841

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C/C++/D联合

联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合、怎么去用、有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还有不当的地方,欢迎指出! 1、什么是联合? “联合”是一种特殊的类,也是一种构造类型的数据结构。 在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装...

D语言 D Language 积学致远 848

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++学习笔记(9)

最后的一章

weixin_44824965的博客 238

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

std::variant vs union:5大关键优势揭示现代C++类型设计趋势

掌握现代C++类型安全设计,C++17 std::variant 替代联合成为新趋势。相比传统union,它支持类型安全、自动析构、可含复杂对象,适用于多类型变量、状态机等场景,兼具性能与安全性。5大优势揭示演进方向,值得收藏。

LiteProceed的博客 643

【C++】std::variant:安全高效的union替代方案

C++17引入的std::variant是对传统union的类型安全升级。union作为原生共用体,所有成员共享内存但缺乏类型安全,需手动管理生命周期,仅适用于底层开发。std::variant通过自动类型追踪和生命周期管理,支持任意可拷贝类型,内置丰富接口确保运行期安全,可直接用于容器和现代C++特性。两者核心区别在于类型安全和自动化程度:union适合极致性能场景,而variant适用于绝大多数需要多类型处理的业务逻辑。variant额外内存开销极小(仅类型标签),推荐优先使用,除非有严格的底层或性能要

Ape's IT Blog 1034

C++基础语法梳理:位域以及 union 联合!小知识分享

位域 Bit mode:2;//mode 占 2 位 类可以将其(非静态)数据成员定义为位域(bit-field),在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域。 位域在内存中的布局是与机器有关的 位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定 取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域 extern "C" (1)被 extern 限定的函数或变量是 extern 类型的 (..

致力于C语言C++知识分享! 800

C++17之std::variant

从C中采用的c++提供了对union的支持,union是能够保存可能类型列表之一的对象。但是,这种语言特性也有一些缺点: 对象不知道它们当前持有的值的类型。 由于这个原因,您不能有non-trivial的成员,比如std::string(从c++ 11起, union原则上可以有non-trivial的成员,但是必须实现特殊的成员函数,比如复制构造函数和析构函数,因为只有通过代码逻辑才...

janeqi1987的专栏 4万+

C++11标准模板(STL)- 算法 - 集合操作(在已排序范围上)(std::set_difference)

复制来自已排序范围 [first1, last1) 并且不在已排序范围 [first2, last2) 中找到的元素到始于 d_first 的范围。 1) 用 operator< 比较元素,而范围必须对于相同者排序。 3) 用给定的二元比较函数 comp 比较元素,而范围必须对于相同者排序。

qq_40788199的博客 1595

c++ --> union介绍

union介绍   共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。 union与struct比较 先看一个关于struct的例子: struct student { ch...

weixin_30387663的博客 1356

C++核心准则边译边学-X.3 使用variant代替union

union(联合体)和struct相似,也可以包含多个数据成员,但是不同的是同时只允许一个成员有效,因此经常作为作为节约空间的类使用。考虑下面的代码: union Uv { int i; double df; }; Uv u1; u1.i = 100; std::cout << "u1.i=" << u1...

面向对象思考 1248

C# struct代替c++ 的union

     在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Align);当然我们也可以通过设置或编码来设置内存对齐的方式.        然而在.net托管环境中,CLR提供了更自由的方式来控制struct中Layout:我们可以在定义stru

FANET 5718

std::variant 与 std::visit

std::variant 简介 std::variant 是c++17 引入的一个类型,其作用类似于C语言中的Union,但是比Union 的功能强大的多。 C语言中一个联合体Union 可以储存多种类型数据,但缺点有很多。比如: 1 没有可用的方法来判断Union中真实储存的类型,获取值时也是内存拷贝的结果,可能会存在问题。这就只能靠程序员人脑保证获取的值是有意义的。 2 只能储存基础数据类型,不能储存其他结构体 使用 std::variant 声明一个variant对象很容易,我们可以利用std::v

hang_ning的博客 5209

(原创)用c++11打造好用的variant

  variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它。它的具体类型是在初始化赋值时确定。boost中的variant的基本用法: typedef variant&lt;int,char, double&gt; vt; vt v = 1; v = '2'; v = 12.32;   用variant一个好处是可以擦除类型,不同类型的值都统一成一个va...

weixin_34199335的博客 922

c++中union的使用,看高手们如何解释的

大部分转自http://www.cnblogs.com/xdotnet/archive/2011/04/20/cpp_union.htmlunion主要是共享内存,分配内存以其最大的结构或对象为大小,即sizeof最大的。在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也

知之可否 8181
上一篇: 【C++14新特性深度解析】:二进制字面量与数字分隔符如何提升代码可读性?
下一篇: (C++20语法革命)范围for循环支持变量初始化带来的质变影响
LiteCode
博客等级 码龄1年 146粉丝 2019原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值