gpt4 book ai didi

C - 方便处理RAM中的某些数据布局

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:14 26 4
gpt4 key购买 nike

我有以下结构:

typdef struct {
char a[4];
int b;
char c;
int d;
} varT; // Total size is 13 bytes, without padding

它显示了“varT”类型变量在 RAM 中所需的内存布局;

这意味着在 RAM 中,需要以下数据布局:

从地址1000到1013(不包括1013):

[ field 'a', 4 bytes | field 'b', 4 bytes | field 'c', 1 byte | field 'd', 4 bytes ]

从地址1013到1026(不包括1026):

[ field 'a', 4 bytes | field 'b', 4 bytes | field 'c', 1 byte | field 'd', 4 bytes ], ...

但是编译器在字段 c 和字段 d 之间添加了 3 个字节的填充。

为了方便地处理这种存储在 RAM 中的变量,您建议如何绕过该填充?

我想做的类似于以下内容:

varT var;
varT *list[5];

var.a[0] = 'A'; var.a[1] = 'B'; var.a[2] = 'C'; var.a[3] = 'D';
var.b = 9876;
var.c = 'X';
var.d = 1234;

memcpy((void*)(list), (void*)(&var), 13);

var.a[0] = 'E'; var.a[1] = 'F'; var.a[2] = 'G'; var.a[3] = 'H';
var.b = 6543;
var.c = 'V';
var.d = 8887;

memcpy((void*)(list + 13), (void*)(&var), 13);

但由于编译器添加到结构中的填充,这是不可能的。

最佳答案

我认为其中之一是可以做到的。

  • 重新排列元素顺序以便没有填充或使用虚拟变量手动引入填充。
  • 使用编译器的特定功能。就像在 gcc 中一样,__attribute__((packed)), __attribute__((aligned))
  • 序列化元素,然后使用预先固定的众所周知的格式手动复制到数组。

一些笔记。不要使用硬编码结构大小,也不要使用 sizeof 来计算此类应用程序的大小,在这些应用程序中,您正在将结构复制到可能用于通过网络与另一台机器通信或写入一个文件,稍后可以由另一个二进制文件加载。在不同的系统上,相同的代码可以生成不同的填充,因此如您所示从数组中加载存储的数据,并且像这样通过网络传输数组可能会变得非常糟糕。这是因为通信的两个二进制文件可能具有不同的填充量,从而导致不同的布局,这将以非常糟糕的方式破坏事物并且通常很难调试。

另一方面,如果您只是将一个结构复制到另一个结构,那么这可能会起作用,但是 = 会起作用。

关于C - 方便处理RAM中的某些数据布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30590905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com