解释为什么在 c++ 中应该首选 int 而不是多头/空头
Explanation for Why int should be preferred over long/short in c++?
我在某处读到,无论操作系统如何,int 数据类型都能提供更好的性能(与长短相比(,因为它的大小会根据操作系统的字大小进行修改。其中,长和短占据 4 和 2 个字节,可能与操作系统的字大小匹配,也可能不匹配。谁能对此给出一个很好的解释?
从标准
:3.9.1, §2 :
有五种有符号整数类型: "符号字符", "短整数", "整数", "长整"和"长长整"。在 此列表,每种类型至少提供 与之前的存储一样多 在列表中。普通整数具有 建议的自然大小 执行的体系结构 环境 (44(;另一个签名 提供整数类型以满足 特殊需求。
所以你可以说 char <= short <= int <= long <= long long。
但是你不能说短是 2 个字节,长是 4 个字节。
现在对于您的问题,大多数编译器将 int 与其目标平台的寄存器大小对齐,这使得对齐更容易,并且在某些平台上访问速度更快。但这并不意味着你应该更喜欢int。
根据需要选择数据类型。不要在没有性能测量的情况下进行优化。
int
传统上是运行程序的机器最"自然"的积分类型。 "最自然"是什么意思还不太清楚,但我希望它不会比其他类型的慢。 也许更重要的是,在没有充分理由的情况下,几乎普遍使用int
而不是其他类型的传统。 使用其他整数类型会导致有经验的C++程序员在阅读代码时询问原因。
-
short 仅优化存储大小;如果适用,计算总是扩展到 int(即,除非 short 的大小已经相同(
-
不确定 int 应该优先于多头;显而易见的情况是 int 的容量不够用
你已经提到了本地单词大小,所以我就不说了
爱斯基摩人使用四十多个不同的词来表示雪。当你只想传达它是雪时,那么"雪"这个词就足够了。源代码不是关于指导编译器:它是关于人类之间的交流,即使交流可能只是在你现在和以后的自己之间......
干杯和呵呵。
int
不能提供比其他类型更好的性能。实际上,在大多数现代平台上,所有整数类型的性能都相似,除了long long
。如果您想要平台上可用的"最快"整数,C++ 没有为您提供执行此操作的方法。
另一方面,如果你愿意使用 C99 定义的东西,你可以使用那里定义的"fastint"类型之一。
此外,在现代机器上,在大多数情况下,内存层次结构比 CPU 计算更重要。使用较小的整数类型可以将更多整数放入 CPU 缓存中,这将在几乎所有情况下提高性能。
最后,我建议不要使用 int
作为默认数据类型。通常,我看到人们在真正想要一个无符号整数时会伸手去找int
。从有符号到无符号的转换可能会导致细微的整数溢出错误,从而导致安全漏洞。
不要因为固有的"速度"而选择数据类型 - 选择正确的数据类型来解决您要解决的问题。
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 解释为什么在 c++ 中应该首选 int 而不是多头/空头