gpt4 book ai didi

c - 传递许多变量与传递结构

转载 作者:太空狗 更新时间:2023-10-29 16:01:02 24 4
gpt4 key购买 nike

将多个指针传递给函数时,仅就性能而言:将指针传递给内部包含所有指针的结构,然后执行代码 1 之类的操作,还是直接将指针传递给变量更好?

我认为对于少量变量,选项 2 肯定优于选项 1,但是当我们有 100 个变量时情况是否如此?

我发现了一些关于此的问题,但没有一个仅在性能方面非常有说服力。

What is better practise in high-performance computing: passing a struct of data into a function or a set of variables?

Efficiency of passing a struct to a function without instantiating a local variable

Declaring/passing structs vs. declaring/passing individual values

选项 1

void myFunctionOne(void *pointerToStruct){
struct myTypeOfStruct *localPointerToStruct;
localPointerToStruct = (struct myTypeOfStruct *)pointerToStruct;

for(i=0;i<n;++i){
*(localPointerToStruct->a+i) = sth;
*(localPointerToStruct->b+i) = sthElse;
...
*(localPointerToStruct->z+i) = sthElsez;
}
}

选项 2

void myFunctionOne(double *a, double *b,...,double *z){
for(i=0;i<n;++i){
*(a+i) = sth;
*(b+i) = sthElse;
...
*(z+i) = sthElsex;
}
}

选项 3

第三种可能看起来有点奇怪的选择是第一种情况,但不是迭代结构内部的指针,而是将它们复制到局部指针变量。

void myFunctionOne(void *pointerToStruct){
struct myTypeOfStruct *localPointerToStruct;
localPointerToStruct = (struct myTypeOfStruct *)pointerToStruct;

double *a = localPointerToStruct->a;
double *b = localPointerToStruct->b;
...
double *z = localPointerToStruct->z;

for(i=0;i<n;++i){
*(a+i) = sth;
*(b+i) = sthElse;
...
*(z+i) = sthElsex;
}
}

最佳答案

为了评估方法的整体效率,您需要考虑函数调用的方式,因为第一种方法的效率在很大程度上取决于 struct 来自哪里.

如果您必须在每次调用之前执行相同的 struct 设置,则第一种方法与第二种方法相同,只是现在您负责为函数准备堆栈帧。

另一方面,如果您可以设置一次struct,然后使用它进行多次调用,那么您将减少复制。

为了完整起见,如果您必须动态分配您的结构,性能会明显变差。

struct 方法的一个重要优点是维护。如果您决定向 struct 添加另一个字段,您只需向 struct 添加另一个字段,一切都会继续编译。但是,向函数添加额外参数会迫使您重新访问代码中进行调用的所有位置,并为新添加的参数添加新的参数表达式。

我会修改第一种方法以采用 myTypeOfStruct 而不是 void*,因为没有必要隐藏参数类型。毕竟,备选方案直接传递 double 数组,而不进行 void* 强制转换。我也更喜欢数组语法而不是指针操作:

void myFunctionOne(struct myTypeOfStruct *pointerToStruct){
for(i=0;i<n;++i){
pointerToStruct->a[i] = sth;
pointerToStruct->b[i] = sthElse;
...
pointerToStruct->z[i] = sthElsez;
}
}

关于c - 传递许多变量与传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38763919/

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