为什么使用无符号短整型比使用整型慢?

4
网页上,对于unsigned short数据类型的评论如下:

这种数据类型用于减少内存使用量(尽管生成的可执行文件可能比使用int更大且可能更慢)

为什么会这样呢?

int 通常用作本机 CPU 字长,因此在内存和 CPU 寄存器之间移动时可能更快。这主要涉及对齐问题。 - Some programmer dude
请查看内置类型的性能 - Anton Shwarts
3
这个说法充其量是过于笼统的陈述,你可能不应该依赖这个来源获取好信息。我怀疑它声称“可能”更慢的依据并不充分。同样地,它声称float被“用于在所使用的值不变化广泛时减少内存使用”也是可疑的(float确实有较窄的范围,但它也具有较粗糙的精度)。至于double,它说:“表示处理器处理的数据的‘正常’大小;这通常是使用的浮点数据类型”,这是没有依据的。(名称“double”暗示它是默认大小的两倍。) - Eric Postpischil
1
@EricPostpischil 谢谢,我可能应该查阅更多的资料。 - George Tian
2个回答

5

我认为"probably slower"这个用语太过严谨。

一个理论事实是:

计算至少使用int大小,例如:

short a = 5;
short b = 10;
short c = a + b;

这个代码片段包含三个隐式转换。 ab 被转换为 int 并相加。结果被再次转回 short。你无法避免它,因为在 C++ 中的算术运算至少使用 int 大小,这被称为整数提升。
实际上,大多数转换都会被编译器避免。 优化器也将删除许多转换。

4
但所有这些转换都是假设的。结果必须与假定进行这些转换所计算出的结果相匹配。实际上,根据 CPU 架构,在实践中它们经常可以完全忽略。 - TonyK
编译器在这个过程中进行任何转换吗? - IssamTP
@IssamTP "编译器"是什么?哪个编译器呢?有很多不同的编译器,它们的行为也不同。 - Thomas Sablik
1
同意@TonyK的观点。只需比较这两个添加short/int数组的函数:https://godbolt.org/z/KnxEJA。显然,GCC针对AVX2使用打包的16位加法进行`short`(`vpaddw`指令)操作,因此不需要转换为`int`。 - Daniel Langr

2

通常情况下,当一个short类型的变量传入函数时,它会被转换成int类型。这就需要额外生成一些代码来完成这个过程。因此,即使你定义了一个short类型的变量,函数也会将其视为int类型。


甚至可以使用long类型,如果参数通过64位寄存器传递:https://godbolt.org/z/FFd4-7。 - Daniel Langr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接