可以使用switch语句处理的最大事例数
Maximum number of cases that can be addressed using switch statement
这是出于好奇。在一个开关中,包括默认:案例在内,我可以拥有的最大开关案例数是多少。我的意思是:
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++标准没有为开关语句应支持的标签数量设置最小值。
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 如何将 if else 语句重写为 switch 语句
- Switch 语句(字符串)一直选择默认值,除非其为零
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 默认标签显然在 switch 语句中不起作用
- C++如何在 switch 语句中放置两个参数
- 如何在 c++ 中从 switch 语句返回不同类型的变量
- 在编译时自动生成用于稀疏数组索引的switch语句
- C++ Switch 语句中的数学运算
- 变量不能在 lambda 中隐式捕获,并且没有使用 switch 语句指定捕获默认值
- 在任何案例之前,在 switch 语句中的使用声明是否合法?
- 使用 switch 语句将不同的函数作为类属性分配 C++
- 为什么我的 switch 语句没有响应一半的情况?
- 如何从映射中获取值并在 C++ 的 switch 语句中使用它
- switch 语句导致发送两条消息
- C++ Switch 语句在中断后执行
- switch语句,两种类似情况不同
- switch 语句和对象隐式 int 转换
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)