c-在处理具有不同结构的同一数据集时,避免取消引用



从现在起,我已经阅读Stackoverflow很长时间了,学到了很多。

但现在我遇到了一个问题,我在Stackoverflow上找不到,甚至它应该是一个"标准";问题所以,如果这个话题已经得到回答,请原谅我。

问题:

我正在编写一个为输入和输出结构定义接口的模块。它应该是某种";多路复用器";可能有三个输入和一个输出。模块应将其中一个输入切换到输出(取决于某些逻辑(。

这里显示了一个工作示例:

#include <stdio.h>
typedef struct{
short myVariable1;
short myVariable2;
} myType;
struct input_type{
myType Inp1;
myType Inp2;
myType Inp3;
};
struct output_type{
myType Out1;
};
struct input_type input;
struct output_type output;
void main(){

for (int i=0; i<10; i++){ // this for loop simulates a cyclic call of a function where all the inputs are written
input.Inp1.myVariable1 = i;
input.Inp2.myVariable1 = i*2;
input.Inp3.myVariable1 = i*3;
printf("Inp1: %d | Inp2: %d | Inp3: %d n",input.Inp1.myVariable1,input.Inp2.myVariable1,input.Inp3.myVariable1);
output.Out1 = input.Inp2;  // Actual routing is done here, but i want to avoid this copy by working on the same dataset (e.g. input.InpX)
printf("Out: %dn",output.Out1.myVariable1);
}
}

在这个剪切中,结构只是在每个循环中复制。为了避免这个步骤,我可以做以下操作:

#include <stdio.h>
typedef struct{
short myVariable1;
short myVariable2;
} myType;
struct input_type{
myType Inp1;
myType Inp2;
myType Inp3;
};
struct output_type{
myType * Out1;
};
struct input_type input;
struct output_type output;
void main(){

output.Out1 = &input.Inp2; // Actual routing is done here; But in this case, the output structure includes a pointer, therefore all other modules need to dereference Out1 with "->" or "*"

for (int i=0; i<10; i++){ // this for loop simulates a cyclic call of a function where all the inputs are written
input.Inp1.myVariable1 = i;
input.Inp2.myVariable1 = i*2;
input.Inp3.myVariable1 = i*3;
printf("Inp1: %d | Inp2: %d | Inp3: %d n",input.Inp1.myVariable1,input.Inp2.myVariable1,input.Inp3.myVariable1);

printf("Out: %dn",output.Out1->myVariable1);
}
}

但在这种情况下,输出结构不再与现有接口兼容。对Out1的访问将需要取消引用。

在不更改接口的情况下,是否可以避免将结构从一个复制到另一个?

提前感谢您的回答!里斯。

在不更改接口的情况下,是否可以避免将结构从一个复制到另一个?

By;现有接口";,我认为你的意思是,你有消耗这种类型的对象的代码。。。

struct output_type{
myType Out1;
};

。。。并且您希望避免修改该代码。

在这种情况下,不,你不能代替

struct output_type{
myType * Out1;
};

。此外,在前一个结构的设计中,填充作为直接成员的myType涉及复制您关心的所有数据,无论是基于每个成员还是基于整个结构。

在这一点上,我建议您坚持制作这些副本,直到您发现这样做会导致性能或内存使用不令人满意。在这一点上进行更改将不仅仅涉及语法更改:它需要仔细审查struct output_type的所有使用,以发现并缓解代码依赖于原始结构属性的任何情况(例如,确保无混叠(。

相关内容

  • 没有找到相关文章

最新更新