Memory 使用16位整数的重要性

Memory 使用16位整数的重要性,memory,types,Memory,Types,开发人员在编写代码时会认真考虑使用16位整数吗?自从我开始编程以来,我一直在使用32位整数,但我并没有真正考虑使用16位整数 声明32位int非常容易,因为它是大多数语言的默认值 除了节省少量内存外,使用16位整数还有什么好处?您可能需要在65535处换行。 您可能需要处理从包含16位字段的设备发送的消息。在这种情况下,使用32位整数将导致您访问消息中错误偏移量处的位。 您可能正在使用嵌入式16位micro或嵌入式8位micro。提示:并非所有处理器都是x86,32位。您可能需要在65535处换

开发人员在编写代码时会认真考虑使用16位整数吗?自从我开始编程以来,我一直在使用32位整数,但我并没有真正考虑使用16位整数

声明32位int非常容易,因为它是大多数语言的默认值


除了节省少量内存外,使用16位整数还有什么好处?

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

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

在大型阵列中,“节省少量内存”可以改为“节省大量内存”。

在大型阵列中,“节省少量内存”可以改为“节省大量内存”。

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

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

16位整数的使用主要是为了在不占用任何多余空间的情况下,为通过网络传输的内容编码、节省硬盘等。如果您有一个非常大的整数数组,或者有很多包含整数的对象,那么节省内存有时也会很有用


使用16位整数而没有很好的内存节省理由是毫无意义的。16位局部变量通常都是用32位或64位整数静默实现的。

16位整数的使用主要是为了在不占用任何空间的情况下通过网络传输、节省硬盘等需要编码的内容。如果您有一个非常大的整数数组,或者有很多包含整数的对象,那么节省内存有时也会很有用


使用16位整数而没有很好的内存节省理由是毫无意义的。16位局部变量通常都是用32位或64位整数静默实现的。

您使用16位数据类型的频率可能比您知道的要高。C#和Java中的char数据类型都是16位的。Unicode通常存储在16位数据类型中。

您使用16位数据类型的频率可能比您所知道的要高。C#和Java中的char数据类型都是16位的。Unicode通常存储在16位数据类型中。

当您为大量数值分配内存时,几乎不需要节省一点内存[read:50%]。常见用途包括:

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

当您为大量数值分配内存时,几乎不会节省一点内存[读取:50%]。常见用途包括:

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

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

    当我们在工作中对我们的代码进行同行评审时,如果某个代码的大小不正确,它将被写为不一致,必须予以纠正。如果我们使用int32_t找到范围为1-1000的对象,则必须对其进行更正。还必须在注释中记录范围。我们部门不允许使用int、long等,我们必须使用int32、int16、uint16等,以便记录预期大小

    uint16_t conicAngle;   // angle in tenths of a degree (range 0..3599)  
    
    或在Ada中:

    type Amplitude is range 0 .. 255;   // signal amplitude from FPGA
    
    得到
    #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";
    }
    
    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.