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。该副本绝对有效,但我必须非常小心我的结构。如果我的填充物发生变化并且我不更新此副本 - 它不会再正确复制。
几个注意事项:
- 代码都是C语言
- 内部和外部变量已经创建。
- 我不能移动数据,我需要复制,因为复制后要使用内部。
- 无需担心数据中指针的深拷贝,一切都是微不足道的数据类型。
谁能想出更优雅的解决方案?我不喜欢我提出的任何一种解决方案,直接分配或多个 memcpys。另外,如果我能把这部分代码迁移到C++,会有更好的解决方案吗?
感谢任何帮助,谢谢!
使用offsetof()
计算偏移量。加法和乘法 sizeof()
不允许在成员之间进行填充。
memcpy(&external, &internal, offsetof(ExternalData, filler));
memcpy(&external.num7, &internal.num7, sizeof(external) - offsetof(ExternalData, num7));
我有以下两种结构:
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。该副本绝对有效,但我必须非常小心我的结构。如果我的填充物发生变化并且我不更新此副本 - 它不会再正确复制。
几个注意事项:
- 代码都是C语言
- 内部和外部变量已经创建。
- 我不能移动数据,我需要复制,因为复制后要使用内部。
- 无需担心数据中指针的深拷贝,一切都是微不足道的数据类型。
谁能想出更优雅的解决方案?我不喜欢我提出的任何一种解决方案,直接分配或多个 memcpys。另外,如果我能把这部分代码迁移到C++,会有更好的解决方案吗?
感谢任何帮助,谢谢!
使用offsetof()
计算偏移量。加法和乘法 sizeof()
不允许在成员之间进行填充。
memcpy(&external, &internal, offsetof(ExternalData, filler));
memcpy(&external.num7, &internal.num7, sizeof(external) - offsetof(ExternalData, num7));