从现在起,我已经阅读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
的所有使用,以发现并缓解代码依赖于原始结构属性的任何情况(例如,确保无混叠(。