我正在创建一组枚举值,但我需要每个枚举值为64位宽。如果我没记错的话,枚举通常与int大小相同;但我记得在某个地方读到过(至少在GCC中)编译器可以使枚举任何宽度以容纳其值。那么,是否可能拥有一个64位宽度的枚举?
int
。short
和 long
也是整数类型,并且无论实现选择什么,所有值都必须适合(“shall be capable of representing the values of all the members of the enumeration”)。 - user824425enum my_enum { my_value }
,my_value
将具有类型int
,但是enum my_enum
可以具有实现定义的类型,该类型必须至少表示所有枚举值。因此,my_value
可能会被截断转换为enum my_enum
,但保证不会溢出。 - P O'Conbhuienum
只保证足够容纳int
值,编译器可以根据定义的枚举常量自由选择实际使用的类型,因此如果可以表示您定义的值,它可能会选择更小的类型。如果需要枚举常量无法适应int
类型,就需要使用特定于编译器的扩展来实现。
枚举
只保证足够大,能够容纳枚举中最大枚举值的数值。 - M.Mint
值。这是正确的陈述。你的陈述实际上是不正确的。如果枚举器比int
大,那么enum
将无法保存最大的枚举器。我通过将我的64位枚举器截断为最大的int
(在我的情况下是32位)来学习到了这一点。 - SO_fix_the_vote_sorting_bugint
类型。您所描述的行为是编译器特定的扩展。 - M.M只需将枚举的最后一个值设置为足够大的值,使其成为您想要的枚举大小即可:
enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};
sizeof(a)
为4,sizeof(last)
为8。 - Mateo de Mayoenum
变量的大小没有控制权。 它完全取决于实现,编译器提供了使用enum
来存储整数名称的选项,所以enum
遵循整数的大小。enum
保证大小与int
相同。有一个编译时选项(-fshort-enums
)可以将其缩短(这主要适用于值不超过64K的情况)。没有编译时选项可以将其大小增加到64位。enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;
它将输出4。因此,无论enum
包含多少个元素,其大小始终是固定的。
enum
大小时一个重要的考虑因素实际上是内存使用。内存优化已经死了,还是所有人都认为编译器仍然是宇宙中心,并且它自动将所有东西变得快速和最优而不需要程序员付出任何努力?如果你只需要256个值或更少的enum
,那么为什么需要使用比所需更大的数据类型呢?(数据模型不是借口。这些值通常很容易进行符号扩展,例如在寄存器中存储时。) - AMDG1<<31
和1<<30
这样的大枚举值之间有巨大间隔是完全合理的。 - undefined