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

亚历山大·拉赫梅夫(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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么Proguard在Android中保留Activity类?

来自分类Dev

为什么java在jvm public中保留length字段

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么要在结构中打包单个枚举?

来自分类Dev

为什么要在分层ViewController结构中使用NSFetchedResultsController?

来自分类Dev

需要在pyParsing语法中保留注释

来自分类Dev

为什么UIViewController会保留在内存中

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在tesseract中保留文档结构

来自分类Dev

在 JMESPath 查询中保留层次结构

来自分类Dev

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

来自分类Dev

分配内存以在C中保存结构数组

来自分类Dev

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

来自分类Dev

为什么在使用Coherance时在缓存中保留序列化可提高性能?

来自分类Dev

为什么Visual Studio在项目文件中保留一个空的ItemGroup节点?

来自分类Dev

为什么取消引用运算符在C ++中保留多态性(后期绑定)?

来自分类Dev

iOS:我需要在字典ios中保留密钥吗?

来自分类Dev

iOS:我需要在字典ios中保留密钥吗?

来自分类Dev

需要在文本中保留大括号以打印到文件

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

    为什么Proguard在Android中保留Activity类?

  9. 9

    为什么java在jvm public中保留length字段

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

    为什么要在结构中打包单个枚举?

  14. 14

    为什么要在分层ViewController结构中使用NSFetchedResultsController?

  15. 15

    需要在pyParsing语法中保留注释

  16. 16

    为什么UIViewController会保留在内存中

  17. 17

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

  18. 18

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

  19. 19

    如何在tesseract中保留文档结构

  20. 20

    在 JMESPath 查询中保留层次结构

  21. 21

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

  22. 22

    分配内存以在C中保存结构数组

  23. 23

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

  24. 24

    为什么在使用Coherance时在缓存中保留序列化可提高性能?

  25. 25

    为什么Visual Studio在项目文件中保留一个空的ItemGroup节点?

  26. 26

    为什么取消引用运算符在C ++中保留多态性(后期绑定)?

  27. 27

    iOS:我需要在字典ios中保留密钥吗?

  28. 28

    iOS:我需要在字典ios中保留密钥吗?

  29. 29

    需要在文本中保留大括号以打印到文件

热门标签

归档