C++ 使用switch语句可以解决的最大情况数

C++ 使用switch语句可以解决的最大情况数,c++,switch-statement,standards,C++,Switch Statement,Standards,这是出于好奇。在一个开关(包括默认的:case)中,我可以拥有的开关盒的最大数量是多少。我的意思是: switch(ch) { case 1: //some statement break; case 2: //some statement break; . . . . case n: //some statement break; default: //default statement } 我的问题是,我们在这里能得到的最大值是什么?虽然这在程序上并不重要,但我发现这是一个相当有趣的想法

这是出于好奇。在一个开关(包括默认的:case)中,我可以拥有的开关盒的最大数量是多少。我的意思是:

switch(ch)
{
case 1:
//some statement
break;
case 2: 
//some statement
break;
.
.
.
.
case n:
//some statement
break;
default:
//default statement
}
我的问题是,我们在这里能得到的最大值是什么?虽然这在程序上并不重要,但我发现这是一个相当有趣的想法。我搜索了一些博客,找到了一份声明

根据我的一份文件,据说:

标准C规定一个开关至少可以有257个外壳 声明。标准C++建议至少16384例 声明将得到支持!真正的价值必须是实现 依赖的

但我不知道这个信息有多准确,有人能给我一个主意吗?还有,依赖于实现意味着什么?假设有这样一个限制,我是否可以将其更改为更高或更低的值?

,第
5.2.4.1节
翻译限制说明:

实施应能够翻译和执行至少一个 至少包含以下每个限制的一个实例:13)

并包括以下行:

-开关语句的1023个大小写标签(不包括任何嵌套开关的大小写标签 (声明)

附录B(资料性)实施数量
规定:

限制可能会限制包括以下所述的数量 或者其他。建议在每个数量后使用括号内的编号 作为该数量的最小值。但是,这些数量仅为 指导方针,不确定合规性

-switch语句的大小写标签(不包括任何嵌套语句的大小写标签 开关语句)[16 384]

附录B(资料性)实施数量说明(重点):

<>因为计算机是有限的,C++实现不可避免地限制了它们成功处理的程序的大小。strong>每个实施都应记录已知的限制。[……]

限制可能会限制包括以下所述或其他内容的数量。建议将每个数量后括号内的数字作为该数量的最小值。但是,这些数量只是指导原则,并不决定合规性

并包括以下项目:

-switch语句的大小写标签(不包括任何嵌套switch语句的大小写标签)[16384]

但这些并不是硬性限制,只是关于最低限度的建议

实现是编译器、标准库和支持工具,因此依赖于实现基本上意味着在这种情况下,编译器将决定限制是什么,但它应该记录此限制。标准草案将第
1.3.10节中的实施定义行为定义为:

行为,对于格式良好的程序构造和正确的数据,这取决于实现和每个实现文档

我们可以看到C的
gcc

GCC仅受可用内存的限制

在这个例子中,它也应该覆盖C++,看起来也不设限制:

Microsoft C不限制switch语句中大小写值的数量。该数字仅受可用内存的限制。ANSI C要求switch语句中至少允许有257个case标签


我找不到类似的文档来说明依赖于实现的方法,行为不是由标准定义的,而是由编译器决定的。C++标准没有为交换机语句支持多少标签设置最小值。

< P>您的问题是标记C++,所以每个C++ 98附件B/1:< /P> <>因为计算机是有限的,所以C++实现是不可避免的。 限制了他们能够成功处理的程序的大小。 在已知的情况下,每个实施应记录这些限制。 本文件可能引用存在的固定限制,例如如何 根据可用资源计算可变限制,或者 固定限制不存在或未知

然后是附件B/2:

限制可能会限制包括以下所述的数量 或者其他。建议在每个数量后使用括号内的编号 作为该数量的最小值。但是,这些数量仅为 指导方针,不确定合规性


因此,只要实现记录了它所做的事情,就可以允许任何最大数量的case语句。但是,该标准在以下列表中建议使用16384。

理论上,switch语句可以使用的最大情况数取决于所使用变量的数据类型:

data_type x

switch(x)
{
...
}
对于char,您有256,对于short您有65536…等等;给定该数据类型,可以表示的最大值数

然而,编译器必须为这个开关(语句)生成代码,而它通常生成的代码类似于

cmp(R1,$value)
IFT jmp _subroutine
cmp(R1,$value2)
IFT jmp _subroutine2
...

您添加的案例越多,寄存器上的压力就越大,代码大小也就越大。由于内存和寄存器不是无限的,而且编译器是人工编写的,因此必须有一个限制,这就是
依赖于实现的
。每个编译器可以允许不同的情况下的交换机语句。

C++标准中的实现数量的位是非规范的。也就是说,16384只是一个礼貌的建议,符合标准的实现可以支持更少的情况。通常情况下,支持的情况比手动键入的情况多。依赖于实现意味着它取决于实现。该语言的一个实现是编译器、标准库和任何必需的运行时支持。所以,所有这些都表明这取决于您使用的编译器。所以,你只能找到一个特定编译器的上限。修正你的引号,这是最好的