可以使用switch语句处理的最大事例数

Maximum number of cases that can be addressed using switch statement

本文关键字:switch 语句 处理 可以使      更新时间:2023-10-16

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

switch(ch)
{
case 1:
//some statement
break;
case 2: 
//some statement
break;
.
.
.
.
case n:
//some statement
break;
default:
//default statement
}

我的问题是,我们在这里可以拥有的最大价值是什么?尽管这在程序上并不重要,但我发现这是一个相当有趣的想法。我搜索了一些博客,在这里找到了一份声明。

从我的一位医生那里,据说:

标准C规定交换机至少可以有257种情况声明。标准C++建议至少16384个案例支持语句!真正的价值必须是实现依靠的

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

C++标准草案Annex B (informative) Implementation quantities说(emphasis mine):

由于计算机是有限的,C++实现不可避免地会受到它们能够成功处理的程序大小的限制每个实施都应记录已知的限制。[…]

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

包括以下项目:

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

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

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

行为,对于一个格式良好的程序结构和正确的数据,这取决于实现,并且每个实现都记录

我们可以看到gcc没有对C:施加限制

GCC仅受可用内存的限制。

在这种情况下,它还应该涵盖C++,并且看起来Visual Studio也没有设置限制:

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

我找不到clang的类似文档。

您的问题被标记为C++,因此根据C++98附录B/1:

由于计算机是有限的,C++实现不可避免他们能够成功处理的程序的大小有限。每次实施都应记录已知的限制。该文件可能会引用存在的固定限制,比如如何根据可用资源计算变量限制,或者说固定限制不存在或未知。

然后是附件B/2:

限制可能会限制数量,包括以下描述的数量或其他。建议每个数量后面加括号的数字作为该数量的最小值。然而,这些数量只是指导方针,而不是确定合规性。

因此,只要实现记录了它正在做的事情,就允许任意数量的case语句。然而,该标准在以下列表中建议16384。

根据c99标准,5.2.4.1翻译限制部分规定:

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

包括以下行:

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

按照c++98标准,Annex B (informative) Implementation quantities表示:

限制可能会限制数量,包括以下描述的数量或其他。建议每个数量后面加括号的数字作为该数量的最小值。然而,这些数量只是指导方针,而不是确定合规性。

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

理论上,switch语句的最大事例数取决于您使用的变量的数据类型:

data_type x
switch(x)
{
...
}

对于char,您有256;对于short您有65536。。。等等给定该data_type,可以表示的最大值数。

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

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

添加的案例越多,寄存器的压力就越大,代码大小也就越大。由于内存和寄存器不是无限的,而且编译器是人工编写的,所以必须有一个限制——这就是implementation dependent的含义。每个编译器都可以为switch语句允许不同数量的case。

依赖于实现意味着,行为不是由标准定义的,而是由编译器决定的。C++标准没有为开关语句应支持的标签数量设置最小值。