为什么要在结构中保留内存?

亚历山大·拉赫梅夫(Alexander Rakhmaev)

我经常在代码中看到结构,在结构的末尾有一个内存储备。


struct STAT_10K4
{
     int32_t npos; // position number
     ...
     float Plts;
             Pxts;
     float Plto [NUM];
     uint32_t reserv [(NUM * 3)% 2 + 1];
};
  1. 他们为什么这样做呢?
  2. 为什么有些储备值取决于常数?
  3. 如果您不准备金,会发生什么?还是在尺寸上有误?
丹·杰森

这通常是为了支持可变长度记录。可以使用以下几种方法:

1如果知道最大记录数,则所有情况都可以使用简单的结构定义。

2在许多协议中,都有一个“标头数据”习惯用法。标头为固定大小,但为数据变量。数据将作为“ blob”接收。因此,可以通过指向blob的指针来声明和访问标头的结构,然后从该数据开始进行数据处理。例如:

typedef struct
{
    uint32_t messageId;
    uint32_t dataType;
    uint32_t dataLenBytes;
    uint8_t data[MAX_PAYLOAD];
}
tsMessageFormat;

数据是在Blob中接收的,因此是void* ptr, size_t len

然后强制转换缓冲区指针,以便可以按以下方式读取消息:

tsMessageFormat* pMessage = (psMessageFormat*) ptr;
for (int i = 0;  i < pMessage->dataLenBytes;  i++)
{
    //do something with pMessage->data[i];
}

在某些语言中,“数据”可以指定为空记录,但是C ++不允许这样做。有时您会看到省略了“数据”,并且您必须执行指针算术才能访问数据。

替代方法是使用构建器模式和/或流。

Windows经常使用这种模式。许多结构都有一个cbSize字段,字段允许将其他数据传递到该结构之外。该结构可适应大多数情况,但是具有cbSize允许在必要时提供其他数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类PHP

为什么我的cookie不能在Laravel中保留(使用Homestead,Vagrant)?

来自分类Linux

为什么连续写入会在缓冲区中保留4K字节?

来自分类Dev

为什么连续写入会在缓冲区中保留4K字节?

来自分类Java

如何在内存中保留位图

来自分类Dev

在golang中保留嵌套结构

来自分类Dev

为什么要在结构上使用&符号?

来自分类Dev

为什么结构引用的内存地址会更改?

来自分类Dev

在Golang结构字段中保留类型

来自分类Dev

为什么结构中的变量不保留其值?

来自分类Dev

为什么C#内存流保留这么多内存?

来自分类Dev

预先在Julia中保留阵列内存

来自分类Dev

为什么需要在c / c ++中分配内存?

来自分类Dev

为什么将一个变量的值分配给另一个变量在python中保留在内存中?

来自分类Dev

为什么UIViewController会保留在内存中

来自分类Dev

JVM为什么要在内存中重定位对象?

来自分类Dev

为什么建议不要在UI中保留片段?

来自分类Dev

为什么要在结构中使用malloc?

来自分类Dev

为什么要在结构中放入结构的大小?

来自分类Dev

在共享内存中保留固定大小的符号

来自分类Dev

为什么要在运行malloc代码之前分配内存?

来自分类Dev

为什么kd-tree是主要的内存结构?

来自分类Dev

为什么需要在结构中填充?

来自分类Dev

为什么不能在同一分配中保留两个连续的内存区域,而不用一次调用就保留两个连续的内存区域?

来自分类Dev

在 JMESPath 查询中保留层次结构

来自分类Dev

我需要在 Proguard 中保留什么才能运行 ObjectDB?

来自分类Dev

每个数据类型都在数组中保留一个内存或地址,但为什么逗号(,)不将其内存保留在数组中

来自分类Dev

在结构中保留对 timer::guard 的引用

来自分类Dev

为什么要在 Nexus 中保留多个快照?

来自分类Dev

为什么在此示例中保留子类型而不使用 out 关键字?

Related 相关文章

  1. 1

    为什么我的cookie不能在Laravel中保留(使用Homestead,Vagrant)?

  2. 2

    为什么连续写入会在缓冲区中保留4K字节?

  3. 3

    为什么连续写入会在缓冲区中保留4K字节?

  4. 4

    如何在内存中保留位图

  5. 5

    在golang中保留嵌套结构

  6. 6

    为什么要在结构上使用&符号?

  7. 7

    为什么结构引用的内存地址会更改?

  8. 8

    在Golang结构字段中保留类型

  9. 9

    为什么结构中的变量不保留其值?

  10. 10

    为什么C#内存流保留这么多内存?

  11. 11

    预先在Julia中保留阵列内存

  12. 12

    为什么需要在c / c ++中分配内存?

  13. 13

    为什么将一个变量的值分配给另一个变量在python中保留在内存中?

  14. 14

    为什么UIViewController会保留在内存中

  15. 15

    JVM为什么要在内存中重定位对象?

  16. 16

    为什么建议不要在UI中保留片段?

  17. 17

    为什么要在结构中使用malloc?

  18. 18

    为什么要在结构中放入结构的大小?

  19. 19

    在共享内存中保留固定大小的符号

  20. 20

    为什么要在运行malloc代码之前分配内存?

  21. 21

    为什么kd-tree是主要的内存结构?

  22. 22

    为什么需要在结构中填充?

  23. 23

    为什么不能在同一分配中保留两个连续的内存区域,而不用一次调用就保留两个连续的内存区域?

  24. 24

    在 JMESPath 查询中保留层次结构

  25. 25

    我需要在 Proguard 中保留什么才能运行 ObjectDB?

  26. 26

    每个数据类型都在数组中保留一个内存或地址,但为什么逗号(,)不将其内存保留在数组中

  27. 27

    在结构中保留对 timer::guard 的引用

  28. 28

    为什么要在 Nexus 中保留多个快照?

  29. 29

    为什么在此示例中保留子类型而不使用 out 关键字?

热门标签

归档