C++ 使用uu int16(或int16_t)优于int的优点/缺点

C++ 使用uu int16(或int16_t)优于int的优点/缺点,c++,visual-studio,windows-10,C++,Visual Studio,Windows 10,据我所知,用于int的字节数取决于系统。通常,2或4个字节用于int 根据\uuuuu int8、\uuuuu int16、\uuuuuuu int32和\uuuuu int64都是Microsoft特定的关键字。此外,\uuu int16使用16位(即2字节) 问题:使用\uu int16(或int16\u t)的优点/缺点是什么?例如,如果我确信整数变量的值永远不需要超过16位,那么将变量声明为\uuu int16 var(或int16\u t var)是否有益 更新:我看到一些评论/答案建

据我所知,用于
int
的字节数取决于系统。通常,2或4个字节用于
int

根据\uuuuu int8、
\uuuuu int16
\uuuuuuu int32
\uuuuu int64
都是Microsoft特定的关键字。此外,
\uuu int16
使用16位(即2字节)

问题:使用
\uu int16
(或
int16\u t
)的优点/缺点是什么?例如,如果我确信整数变量的值永远不需要超过16位,那么将变量声明为
\uuu int16 var
(或
int16\u t var
)是否有益


更新:我看到一些评论/答案建议使用
int16\t
而不是
\uu int16
,这是一个很好的建议,但并不是使用
\uu int16
的优点/缺点基本上,我的问题是,使用16位版本的整数而不是int来节省2个字节的优点/缺点是什么?

节省2个字节几乎是不值得的。然而,节省数千字节是非常困难的。如果您有一个包含整数的大数组,那么使用小整数类型可以节省大量内存。这会导致更快的代码,因为使用的内存越少,接收到的缓存未命中就越少(缓存未命中是性能的主要损失)

TL;DR:在大型数组中这样做是有益的,但对于1-off变量没有意义

它们的第二个用途是if,用于处理二进制文件和消息。如果您正在读取一个使用16位整数的二进制文件,那么,如果您可以在代码中精确地表示该类型,那么这将非常方便


顺便说一句,不要使用微软的版本。使用标准版本(
std::int16_t

如果你出于某种原因只需要一个较短的整数类型,它在语言中已经有了这种类型,称为
short
——除非你知道你需要的是16位,否则没有理由不坚持使用不可知的
short
int
类型。广义的想法是,这些类型应该与目标体系结构很好地匹配(例如,请参阅)

也就是说,不需要使用特定于平台的类型(
\uu int16
),您可以使用标准类型:

int16_t
有关更多信息和标准类型,请参见

即使您仍然坚持使用
\uu int16
,您也可能需要一个typedef:

using my_short = __int16;
更新

你的主要问题是:

这种方法的优点/缺点是什么 使用16位版本的整数而不是int来保存2个字节

如果您拥有大量数据(根据经验,大约有100.000-1.000.000个元素),那么就使用更少的cpu缓存而言,总体性能可能会有所降低。总的来说,使用较小的类型(除了明显的类型)并没有缺点,并且可能的转换如

中所述,这取决于具体情况

在x86上,基本类型通常按大小对齐。因此,2字节类型将在2字节边界上对齐。当您有多个短变量时,这非常有用,因为这样可以节省50%的空间。这将直接转化为更好的内存和缓存利用率,从而从理论上提高性能

另一方面,在短于-
int
的类型上执行算术通常需要扩大到
int
的转换范围。因此,如果对这些类型进行大量运算,使用
int
类型可能会获得更好的性能()

所以,如果您关心关键代码部分的性能,profile可以确定使用特定数据类型是更快还是更慢


一个可能的经验法则是——如果内存有限(即有很多变量,尤其是数组),请使用尽可能短的数据类型。如果没有-不用担心,使用
int
类型

使用这些类型的主要原因是确保在不同的体系结构和编译器中变量的大小。我们称之为“代码重用性”和“可移植性”

在更高级的现代语言中,所有这些都将由编译器/解释器/虚拟机等处理,您不必担心,但它会带来一些性能和内存使用成本

当你有某种限制时,你可能需要优化一切。最好的例子是内存容量非常有限且工作频率很低的嵌入式系统。另一方面,有很多编译器有不同的实现。其中一些将“int”解释为“16位”值,另一些解释为“32位”


例如,您通过通信系统接收特定的值流,您希望将其保存在缓冲区或数组中,并且您希望确保输入数据始终被解释为16位,而不考虑其他内容。

缺点:它是特定于Microsoft的。改用。总是喜欢跨平台解决方案而不是单平台解决方案,如果它不需要任何成本的话。@nada:这是明显的缺点。很抱歉,如果我确定程序将在windows计算机上运行,我忘了提到这一点。更新了我的问题。使用较小的类型可能会有好处,但也可能导致完全相反的结果。必要时进行基准测试。@skm可移植性仍然是一个问题,即使保证目标是windows。什么,如果有人想用MinGW编译?呃,很危险。。。即使在今天,也有一些系统(通常是嵌入式系统),其中short和int具有相同的大小!如果你有最小范围的要求,并且想要便携,你通常最好使用显式范围(如果你关心性能的话,可能更喜欢fast而不是fix变体)。@Aconcagua short和int确实有最小范围-你需要充分意识到这一点!也不是那样。但是你需要使用t