使用16位整数的重要性

时间:2009-09-25 14:59:49

标签: memory types

开发人员在编写代码时如何认真考虑使用16位整数?自从我编程以来,我一直在使用32位整数,我真的不考虑使用16位。

很容易声明一个32位的int,因为它是大多数语言的默认值。

除了节省一点内存之外,使用16位整数的好处是什么?

17 个答案:

答案 0 :(得分:8)

既然我们有车,我们不会走路或骑马,但我们仍然会走路和骑马。

这些天使用短裤的需要更少。在很多情况下,磁盘空间的成本和RAM的可用性意味着我们不再需要像20年前那样从计算机中挤出最后一点存储空间,因此我们可以牺牲一点存储效率来节省关于开发/维护成本。

然而,在使用大量数据的情况下,或者我们正在使用具有小内存的系统(例如嵌入式控制器)或当我们通过网络传输数据时,使用32或64位来表示16位值只是浪费内存/带宽。你有多少记忆并不重要,浪费一半或四分之三只会是愚蠢的。

答案 1 :(得分:5)

API /接口(例如TCP / IP端口号)和需要操作(例如旋转)16位值的算法。

答案 2 :(得分:4)

我对相对性能很感兴趣所以我编写了这个小测试程序来执行一个非常简单的测试,分析,使用和释放大量和短格式的大量数据。

我在测试缓存等情况下多次运行测试,等等。

#include <iostream>
#include <windows.h>

using namespace std;

const int DATASIZE = 1000000;

template <typename DataType>
long long testCount()
{
    long long t1, t2;

    QueryPerformanceCounter((LARGE_INTEGER*)&t1);

    DataType* data = new DataType[DATASIZE];
    for(int i = 0; i < DATASIZE; i++) {
        data[i] = 0;
    }

    delete[] data;

    QueryPerformanceCounter((LARGE_INTEGER*)&t2);
    return t2-t1;
}

int main()
{

    cout << "Test using short : " << testCount<short>() << " ticks.\n";
    cout << "Test using int   : " << testCount<int>() << " ticks.\n";
    cout << "Test using short : " << testCount<short>() << " ticks.\n";
    cout << "Test using int   : " << testCount<int>() << " ticks.\n";
    cout << "Test using short : " << testCount<short>() << " ticks.\n";
    cout << "Test using int   : " << testCount<int>() << " ticks.\n";
    cout << "Test using short : " << testCount<short>() << " ticks.\n";
}

以下是我的系统上的结果(64位四核系统运行windows7 64位,但程序是使用VC ++ express 2010 beta在发布模式下构建的32位程序)

Test using short : 3672 ticks.
Test using int   : 7903 ticks.
Test using short : 4321 ticks.
Test using int   : 7936 ticks.
Test using short : 3697 ticks.
Test using int   : 7701 ticks.
Test using short : 4222 ticks.

这似乎表明,在存在大量数据时,至少在某些情况下使用short而不是int时,显着性能优势。我意识到这远远不是一个全面的测试,但它有一些证据表明它们不仅使用更少的空间,而且至少在某些应用程序中它们的处理速度也更快。

答案 3 :(得分:3)

16位值仍然需求很大(虽然未签名也可以 - 不需要签名)。 例如,

  • 16位Unicode - UTF-16 / UCS-2。
  • 16位图形 - 尤其适用于嵌入式设备。
  • 16位校验和 - 用于UDP标头和类似的。
  • 16位设备 - 例如许多norflash设备都是16位。

答案 4 :(得分:3)

当存在内存限制时,短暂可以帮助你很多。例如在编写嵌入式系统时,你需要考虑内存。

答案 5 :(得分:2)

您可能需要在65535处换行。 您可能需要处理从包含16位字段的设备发送的消息。在这种情况下使用32位整数将导致您访问消息中错误偏移的位。 您可能正在使用嵌入式16位微控制器或嵌入式8位微控制器。提示:并非所有处理器都是x86,32位。

答案 6 :(得分:2)

这在数据库开发中非常重要,因为有时人们使用的空间比实际需要的多得多(例如,当小的时候使用int就足够了)。当你有数百万行的表时,这可能是重要的因素。数据库大小和查询。我建议人们总是使用适当的列数据类型。

我也尝试使用正确的数据类型进行其他开发,我知道处理long和small会很麻烦(非常方便使用每个int),但我认为它最终会得到回报,例如在序列化对象时

答案 7 :(得分:2)

你问: 保留它们的任何理由是什么?

既然你说'语言不可知',那么答案肯定是'肯定是'。

计算机CPU仍可使用字节,字,完整寄存器等等,无论这些“数据类型”被某些编程语言抽象出多少。总会出现代码需要“触摸金属”的情况。

答案 8 :(得分:1)

在大型数组中,“保存少量内存”可能会“节省大量内存”。

答案 9 :(得分:1)

问题应该是我们需要一个16位原始数据类型的原因,答案是那里有大量数据,这些数据自然以16位表示。一个无处不在的例子是音频,例如CD音频表示为16位有符号整数的流。

答案 10 :(得分:1)

16位仍然足够大以保持像素通道值(例如R,G或B)。大多数像素仅使用8位来存储通道,但Photoshop具有专业人员使用的16位模式。

换句话说,像素可能被定义为struct Pixel16 { short R, G, B, A; },或者图像可能被定义为struct Channel16 { short channel[]; }的单独渠道

答案 11 :(得分:1)

为大量数值分配内存时,几乎没有节省内存[读取:50%]。常见用途是:

  • COM和外部设备互操作
  • 减少大型阵列的内存消耗,其中每个数字的数量永远不会超过几千个
  • 对象对的唯一哈希值,其中不需要超过65K的对象(哈希值只能是32位整数,但请注意哈希表类型必须转换内部表示的值,因此冲突仍然存在可能,但是相等可以基于确切的哈希匹配)
  • 加速依赖structs的算法(较小的值类型转换为在内存中复制时提高的性能)

答案 12 :(得分:1)

你可能比你知道的更频繁地使用16位数据类型。 C#和Java中的char数据类型都是16位。 Unicode通常以16位数据类型存储。

答案 13 :(得分:1)

16位整数的使用主要用于需要对通过网络传输的内容进行编码,保存在硬盘等上而不占用超出必要的空间的情况。如果你有一个非常大的整数数组或许多包含整数的对象,那么保存内存也可能偶尔会有用。

使用16位整数而没有良好的内存保存原因是毫无意义的。无论如何,16位局部变量通常以32或64位整数静默实现。

答案 14 :(得分:0)

曾几何时,在地球的土地上,存在着称为计算机的设备。

在“计算机”发明之后的早期,内存中存储的数据和字符串等奇特内容有限。

程序员Billy受到邪恶巫师(他的老板)的鼓励,使用尽可能少的记忆!

然后有一天,内存大小变得足够大,如果他们想要,每个人都可以使用32位数字!

我可以继续,但所有其他显而易见的事情已经被覆盖。

答案 15 :(得分:0)

这两个字节加起来。您的数据类型最终成为数组或数据库或消息的一部分,它们将进入数据文件。它增加了大量浪费的空间,在嵌入式系统上它可以产生巨大的差异。

当我们在工作中对我们的代码进行同行评审时,如果某些内容的大小不正确,则会将其写为差异,必须予以纠正。如果我们使用int32_t找到范围为1-1000的内容,则必须进行更正。范围也必须记录在注释中。我们的部门不允许使用int,long等,我们必须使用int32_t,int16_t,uint16_t等,以便记录预期的大小。

uint16_t conicAngle;   // angle in tenths of a degree (range 0..3599)  

或在Ada:

type Amplitude is range 0 .. 255;   // signal amplitude from FPGA

养成使用所需内容的习惯,不再记录所需内容(如果语言不支持)。

我们目前正在通过调整多个消息中的数据类型来修复性能问题,它们具有32位字段,可以是8位或16位。通过适当调整大小,我们可以将消息速率降低一半,并提高数据吞吐量以满足要求。

答案 16 :(得分:0)

我认为大多数人在他们的平台上使用默认的int。但是有时你需要与期望16位甚至8位整数的旧系统或库进行通信(感谢上帝,我们不必再担心12位整数)。对于数据库尤其如此。此外,如果您正在进行位屏蔽或位移,您可能有一个指定整数长度的算法。默认情况下,在内存便宜的平台上,您应该使用适合处理器的整数。