enum 类型到底有多大

**MySQL ENUM类型:小而美的数据约束利器,你用对了吗?** MySQL ENUM类型:高效数据约束解决方案 ENUM是MySQL中针对固定选项的高效数据类型,通过内部数字存储实现空间优化和性能提升。实测显示,在处理100万条数据时,ENUM比VARCHAR节省75%存储空间,查询速度提升60%。典型应用场景包括:用户性别(男/女/未知)、订单状态(待支付/已支付/配送中等)以及国际化尺寸编码(XS/S/M/L/XL)。ENUM通过预定义值确保数据完整性,同时支持数字索引查询优化性能。使用时需注意合理设计选项顺序和数量,避免频繁修改ENUM定义。 阅读详情

这里有一个问题:

#include<stdio.h> 
typedef enum {
        CAN1 = 1,
        CAN2,
        CAN3,
        CAN4,
} Enum_8bit;
typedef enum {
        IP4 = 0x1234,
        IP5 = 0x444,
        IP6 = 0xffee,
} Enum_16bit;
void main(void)
{
        printf("Enum_8bit is %d.\n", sizeof(Enum_8bit));  
        printf("Enum_16bit is %d.\n", sizeof(Enum_16bit));
        printf("Enum_8bit element is %d.\n", sizeof(CAN1));   
        printf("Enum_16bit element is %d.\n", sizeof(IP6));   
        Enum_16bit bit16 = IP4;
        Enum_8bit bit8 = CAN1;
        printf("Enum_8bit variable is %d.\n", sizeof(bit8));
        printf("Enum_16bit variable is %d.\n"  , sizeof(bit16));
}  


 一般情况下,上面会打印的结果是什么呢?

对于一个32位的系统来说,如果你是用的GCC,而且CFLAGS是在默认的情况的话,上面输出的都是4.

Enum_8bit is 4.
Enum_16bit is 4.
Enum_8bit element is 4.
Enum_16bit element is 4.
Enum_8bit variable is 4.
Enum_16bit variable is 4.

这里为什么呢?

Enum_8bit 和Enum_16bit在这里,只是一个申明的数据类型,它和int, char一样,只不过是我们用户自己申请的数据类型,它的大小就是它的变量所占有的空间的大小。而不是所有它的element总合的大小。

我的系统是一个64位的系统,为什么这里输出的是4个字节大小,而不是8个字节的大小者 2个字节呢?这里因为在C的standard中:

6.7.2.2 Enumeration specifiers
[...]
Constraints
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int.
[...]
Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration.
enum类型就是一个int 类型,但它占用空间到底有多大呢? 我没有找到相关的文档说明,我个人认为这个取决于你的系统的字节对齐方式和enum中各个元素所给于的值的大小,像上面,我的例子,Enum_8bit 每一个元素的值都没有超过8bit,但及时这样,因为我的系统是以4字节对齐的,C  compiler 分配了4个字节大小给这个类型。Enum_16bit也一样,以四字节对齐。

这不是有点浪费空间吗?能不能缩短它们的大小,让它们根据各自元素的大小来分配大小呢?

是可以的,我们可以用  -fshort-enums,强制改变enum的大小。

如:gcc  -g -O2   -o -fshort-enums enum_test enum-test.o 

Enum_8bit is 1.
Enum_16bit is 2.
Enum_8bit element is 4.
Enum_16bit element is 4.
Enum_8bit variable is 1.
Enum_16bit variable is 2.
但是奇诡,为什么Enum_8bit和Enum_16bit中的元素还是4字节呢?原来对于enum来说,它自己的每一个element就是一个正型,大小取决于它的值,而默认是四字节对齐。

如我把上面的程序改成这样:

#include<stdio.h>                                                                                                                   
typedef enum {
        CAN1 = 1,
        CAN2,
        CAN3,
        CAN4,
} Enum_8bit;
typedef enum {
        IP4 = 0x1234,
        IP5 = 0x444,
        IP6 = 0xffee,
} Enum_16bit;
typedef enum {
        VP1 = 0x1234,
        VP2 = 0x444,
        VP3 = 0xffeeEEEEEEEEEDDE,
} Enum_32bit;
void main(void)
{
        printf("Enum_8bit is %d.\n", sizeof(Enum_8bit));  
        printf("Enum_16bit is %d.\n", sizeof(Enum_16bit));
        printf("Enum_8bit element is %d.\n", sizeof(CAN1));   
        printf("Enum_16bit element is %d.\n", sizeof(IP4));   
        printf("Enum_32bit 64bits element is %d.\n", sizeof(VP3));   
        printf("Enum_32bit 16bits element is %d.\n", sizeof(VP2));   
        Enum_16bit bit16 = IP4;
        Enum_8bit bit8 = CAN1;
        printf("Enum_8bit variable is %d.\n", sizeof(bit8));
        printf("Enum_16bit variable is %d.\n"  , sizeof(bit16));
}
在有 -fshort-enums 的情况下:

gcc  -g -O2 -fshort-enums   -o enum_test enum-test.o 
它的输出结果是:

Enum_8bit is 1.
Enum_16bit is 2.
Enum_8bit element is 4.
Enum_16bit element is 4.
Enum_32bit 64bits element is 8.
Enum_32bit 16bits element is 4.
Enum_8bit variable is 1.
Enum_16bit variable is 2.
在没有 -fshort-enums的情况下:

Enum_8bit is 4.
Enum_16bit is 4.
Enum_8bit element is 4.
Enum_16bit element is 4.
Enum_32bit 64bits element is 8.
Enum_32bit 16bits element is 4.
Enum_8bit variable is 4.
Enum_16bit variable is 4.




手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度) 本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。 阅读详情

相关推荐

【一步到位】Android Studio 实现安卓连接阿里云物联网云平台

最新版本目前是Android Studio Iguana | 2024.1.2,你可以到官网上去找之前的版本,手上有工作项目的不要去轻易尝试,说不定你就编译失败了,失败了也不要担心,解决就可以了。

m0_73799445的博客 1万+

C/C++的enum类型大小

我们在编程时有时想让一个变量的值只在规定范围里取值,那么就会考虑使用enum类型。 例如我们想定义一个变量来表示红绿蓝三原颜色,那么就使用enum来定义取值范围, enum color {RED, GREEN, BLUE}; 然后我们在用enum color来定义变量,并赋值, enum color myColor = GREEN; 本文不是讨论enum的使用细节,而是看一下enum类型的变量...

爱就是是恒久忍耐的专栏 2万+

RTX 50系显卡实战3DGS:从源码编译到避坑指南

本文详细介绍了在RTX 50系显卡上成功运行3D Gaussian Splatting(3DGS)的完整实战指南。针对新显卡架构与旧版预编译包不兼容的核心问题,文章提供了从源码编译CUDA扩展的清晰步骤,包括环境配置、依赖安装、核心模块diff-gaussian-rasterization和simple-knn的编译避坑方法,并涵盖了数据准备、模型训练与实时预览的全流程,帮助开发者高效利用新硬件进行3D重建。

weixin_28314575的博客 263

enum类型的大小

enum结构类型中的变量个数,最大能够定义2^32个。因此有些编译器直接将enum类型的大小固定为4字节。 嵌入式软件开发中,内存相对宝贵,编译器一般根据enum结构类型中定义的变量的值分配enum类型大小。 比如: enum enumType{MONDAY,TUESDAY,WENSDAY = 0XFF}; 那么enumType的大小为1字节。 enum enumType{MON

linghaidong的专栏 8250

超详细neo4j安装教程

一、neo4j简介 最近开始学习知识图谱,所以首先想先学习一下neo4j的使用。 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。由于知识图谱中存在大量的关系型信息(实体—关系—实体), 使用结构化数据库进行存储将产生大量的冗余存储信息, 因此将图数据库作为知识图谱的存储容器成为流行的选择。当前较为常用的图数据库主要有 Neo4j 等。 二、neo4j的安装 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Co

qq_38335648的博客 9万+

Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

weixin_29230901的博客 334

C语言枚举内存占用

enum 枚举是一个C语言比较常用的一个类型,是节约内存的一种方式,一般用来表示类型,类型之类的作用。 为什么说enum能节约内存呢? 这个就和enum的内存分配有关系了。 首先先看实验现象: 实验1: 实验1结果: 这里可以看到这个枚举只占用了1个字节。 实验2: 实验2结果: 这里可以看到还是一个字节 实验3: 实验3结果: 这里可...

HES_C的博客 1万+

SPAD IMX479规格_VOP

对于VOP的定义,很多人可能是不理解这一路的供电,实际上这一路供电是非常重要的,这是给器件SPAD供电,决定SPAD是否work,在大部分的paper以及大部分公司,基本都是叫VOP,名称是SPAD breakdown voltage power supply,严格意义上叫Operating Voltage,工作电压。当然有些公司也有一些其他叫法就不提了。其实大家可以明显的看出,典型值-20.5没有发生变化,市面上绝大多数VOP的典型值也都是在-20V这边。

致力于lidar应用开发 701

C语言枚举类型的大小

主流编译器如:gcc、vc、MinGW-gcc等枚举变量均为4字节。少量编译器会根据枚举个数做优化,如只有3个枚举值时,size可能为1。 enum长度不确定会带来可移植性问题,如果第三方库API接口使用enum类型,编译和调用库时一旦有关enum长度的编译器设置不一致,API接口层对数值的解析就不匹配。比如上层应用编译时没有用-fshort-enums,默认用4字节空间来存储使用enum...

Oliver King 的小窝 1万+

大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅

Spring AI 是一个轻量级开源框架,旨在简化 AI 模型在企业级 Java 应用中的集成与管理。它提供了跨多个 AI 服务提供商的便携式 API,支持聊天、文本转图像、嵌入式模型等多种功能,并兼容主流的 AI 模型提供商如 OpenAI、Google 等。Spring AI 的核心功能包括结构化输出、向量数据库支持、工具/函数调用、可观察性、文档摄取 ETL 框架、AI 模型评估等。

寻道AI,探索AI无限可能! 6364

RT-DETR训练前的准备,将数据集划分成训练集、测试集验证集(附完整脚本及使用说明)

在计算机视觉领域,当我们着手训练一个模型时,。其中,将数据集划分为和更是一项基础性且关键的操作。这篇博客分析了这一划分背后的原因、其重要意义以及如何通过代码实现,帮助大家更好地理解和运用这一技巧,。

Limiiiing的博客 906

C的实用笔记44——枚举类型

1、知识点:定义的方式和结构体和共用体很像,都有三种,考虑到我们不关心枚举变量,用哪种都无所谓。枚举类型声明和枚举变量定义分开写。//w就是enum WeekDay类型的枚举变量//4,因为编译器会把枚举变量当做一个整型变量。//4,因为sizeof最终处理的就是数据的类型,sun是整型常量return 0;声明枚举类型,同时定义枚举变量:后面照样可以定义其他枚举变量声明枚举类型时不写类型名,同时可以不定义枚举变量:以下两种写法都是可以的,因为我们不关系枚举变量,只关心里面的枚举元素。

lzh201864031的博客 1895

IMEI引起的无法驻网问题

问题不复杂,场景很简单,如上图,UE在进行LTE attach过程时,在送完NAS security mode complete后,就立刻收到了网络attach reject 带cause 6 Illegal ME,根据协议描述这个cause 代表ME不被网络可接受,例如ME在禁止名单或者黑名单中就会有这种cause。然而前方在报这个问题的时候,也是知道SIM卡和手机IMEI在运营商那边没能成功绑定,然后才报的问题,要查看手机是不是有问题...... 告诉前方原因后,还认为是手机问题,告知要继续查。

asd199086的博客 1426

MySQl 数据类型 ENUM 和 SET

MySQl 数据类型 ENUM 和SET ENUM, SET 为 MySQl 中的字符串数据类型,相较于CHAR,VARCHAR 这类随意插入任意字符的字符串类型,ENUM, SET 为 只能在指定的集合里取值 的字符串数据类型。 ENUM(枚举值) 1. 单选字符串数据类型 适合存储表单界面中的“单选值”,也就是只能取一个值。 2. 设定ENUM的时候,需要给定 “固定的几个选项”,存储...

路漫远 吾求索 5458

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++枚举类型enum与enum class

文章目录一.关于枚举类型二.枚举类型enum的使用三.枚举类型enum class的使用 一.关于枚举类型 1. 什么是枚举类型? 答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class)。 2. enum与enum class的区别? (为什么需要

冬瓜的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

枚举类型enum详解

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解成什么基本类型。好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的。

让学习成为一种习惯 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MySQL中的enum和set类型

文章目录1 enum类型2 set类型 1 enum类型 ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下: 属性名 ENUM('值1', '值2', …, '值n') 其中,“属性名”参数指字段的名称,“值n”参数表示列表中的第n个值。ENUM类型的值只能取列表中的一个元素。其取值列表中最多能有65535个值。如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。列表中的每个值独有一个顺序排列的编号,M

木子皿--啥都不会的菜鸟 1281

【mysql】ENUM类型

ENUM类型 ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。 其所需要的存储空间由定义ENUM类型时指定的成员个数决定。 文本字符串类型 长度 长度范围 占用的存储空间 ENUM L 1 <= L <= 65535 1或2个字节 当ENUM类型包含1~255个成员时,需要1个字节的存储空间; 当ENUM类型包含256~65535个成员时,需要2个字节的存储

兮动人 8929

C++-枚举类型(enum)

目录enum类型enum类型对象先定义枚举类型,再定义枚举变量定义枚举类型的同时定义枚举变量省略枚举名称,直接定义枚举变量enum例子枚举类型必须连续是可以实现有条件的遍历枚举类型在switch中使用整型转换成枚举 enum类型 枚举类型是被当做 int 或者 unsigned int 类型来处理的 enum 枚举名 {枚举元素1,枚举元素2,……}; 如果想实现 #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI

qq_43535469的博客 6370

mysql中的ENUM类型

ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。在某些情况下,ENUM值也可以为空字符串()或NULL:·         如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。后面有详细讨论。·        

Briver Song的专栏 1万+

C++ 中 enum 与 enum class 的区别:从传统枚举到强类型枚举的进化

传统enum和enum class的选择,本质上是便利性与类型安全性作用域隔离enum class的枚举值被限定在枚举类型的作用域内,必须通过枚举名::值访问。这消除了传统enum中最常见的命名冲突问题,也让代码的可读性大幅提升——Color::Red明显比孤零零的Red更清晰。类型安全enum class不会隐式转换为整数类型,避免了传统enum中枚举值与整数、枚举类型之间意外的混合运算。这种严格性在大型项目中能有效减少 bug。底层类型控制enum class默认底层类型为int。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 456

MySQL 中的 SET 与 ENUM 类型使用详解

MySQL 中的 SET 与 ENUM 类型使用详解 一、SET类型 在创建表时,就指定SET类型的取值范围。 属性名 SET('值1','值2','值3'...,'值n') 其中,“属性名”参数指字段的名称;“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。SET类型的值可以取列表中

kxjrzyk的专栏 2万+

在Mysql中的Enum数据类型

MySQL在内部会将每个值在列表中的位置保存为整数,并且在。

优秀技术文章收录 3891

MySQL数据库列的类型—ENUM和SET类型

一、ENUM类型 1.定义:ENUM类型又称枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下: 属性名 ENUM('值1','值2',......,'值n') 其中,“属性名”参数指定字段的名称,“值n”参数表示列表中的第n个值。ENUM类型的值只能取列表中的第一个元素。其取值列表最多能有65535个值。如果数据列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。列表中的每个值独有...

weixin_46492701的博客 2244

mysql 枚举 enum用法_mysql中的枚举类型ENUM的用法:

mysql中的枚举类型ENUM的用法:(2010-06-18 13:44:13)mysql中的枚举类型ENUM的用法:mysql中的枚举类型ENUM是一个字符串对象,它的值是自表创建时在列规定中显式枚举的一列值。在某些情况下,ENUM值也可以为空字符串('')或NULL:如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不...

weixin_32656107的博客 4758

臭名昭著的 MySQL ENUM 类型 ( 下 )

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 1026
上一篇: Automake 学习笔记之一:The Introduction / Example Of GNU Autoconf, Automake And Libtool
下一篇: 使用shmget在进程共享内存
Bean Huo
博客等级 码龄19年 40粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值