C:将结构成员从一个结构复制到另一个相似但不同的结构

C: Copying structure members from one structure to another similar, but different, structure

我有以下两种结构:

typedef struct
{
    double num1;
    double num2;
    //double num3, num4, num5, num6;  // Removed unused variables to reduce data size
    double num7;
    double num8;
} InternalData;

typedef struct
{
    double num1;
    double num2;
    char   filler[32];  // Used to be num3 - num6
    double num7;
    double num8;
} ExternalData;

假设我有以下两个变量,我正在寻找一种有效的方法将内部结构复制到外部结构,跳过外部的 "filler" 数据。此副本每秒在大量数据上发生多次。

InternalData internal = { 1.0, 2.2, 12.3, 494.7 };
ExternalData external;

显然我可以做一些这样的事情来将内部成员复制到外部。但我不确定这对于大量数据的效率如何以及复制内容的频率。

external.num1 = internal.num1;
external.num2 = internal.num2;
external.num7 = internal.num7;
external.num8 = internal.num8

在InternalData结构中,删除了num3到num6,使内部数据更小;但是,外部数据字节大小无法更改,因此填充字符数组。

当结构匹配时,我能够从一个到另一个执行 memcpy,因为它们是相同的结构。既然它们不匹配,那么将数据从内部复制到外部的最佳解决方案是什么?

通过从开始到填充然后从填充到结束执行 memcpy,我得到了一些工作。类似这样的事情:

int internaloffset = 0;
int externaloffset = 0;
memcpy((char*)&external + externaloffset, (char*)&internal + internaloffset, sizeof(double)*2);
internaloffset += sizeof(double)*2;
externaloffset += sizeof(double)*2 + sizeof(char)*32;
memcpy((char*)&external + externaloffset, (char*)&internal + internaloffset, sizeof(double)*2);

在我的实际代码中,我有偏移量来计算从开始到填充的字节,所以我不必执行 sizeof(double)*2。该副本绝对有效,但我必须非常小心我的结构。如果我的填充物发生变化并且我不更新此副本 - 它不会再正确复制。

几个注意事项:

  1. 代码都是C语言
  2. 内部和外部变量已经创建。
  3. 我不能移动数据,我需要复制,因为复制后要使用内部。
  4. 无需担心数据中指针的深拷贝,一切都是微不足道的数据类型。

谁能想出更优雅的解决方案?我不喜欢我提出的任何一种解决方案,直接分配或多个 memcpys。另外,如果我能把这部分代码迁移到C++,会有更好的解决方案吗?

感谢任何帮助,谢谢!

使用offsetof()计算偏移量。加法和乘法 sizeof() 不允许在成员之间进行填充。

memcpy(&external, &internal, offsetof(ExternalData, filler));
memcpy(&external.num7, &internal.num7, sizeof(external) - offsetof(ExternalData, num7));