用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用相关的知识,希望对你有一定的参考价值。

用地址调用结构体元素中的很慢,怎么解决?
如:struct A
int num;
;
如果函数这样调用int fun(A* a)
那函数体里面就全都是 a->num,这样调用速度比int fun(A a)里面的a.num慢很多啊,在一个追求计算速度的程序里面应该怎么写?

你从哪里看出来传指针速度慢?是你自己代码写的有问题吧。


函数中参数为结构体数据时,有两种处理方式:
 1.传递结构体指针。

 void sum(struct mystruct *node);


 2.传递结构体副本。

 void sum(struct mystruct node);

  在sum函数中创建所传递的结构体的副本,即将结构体的数据成员完全赋值给node.
 

优缺点:
  1.指针传递速度快,效率高,消耗存储空间小,但是无法保护数据不被修改,可以添加const 参数进行限制.
  2.副本传递,效率较低,消耗存储空间大,可以保护数据不被修改,适合于数据成员少而简单的结构体。


追问

真的慢,骗你对我有什么好处,附图,真心求教

这是示例代码,做一样的事,后面是计时

追答

你不怎么早把代码贴出来。

慢的主要原因,是因为你进行了大量的计算,每一次计算都要对结构体里面的成员进行操作。


这样解释一下吧,我们通常说传变量指针比传变量要快,指着是【函数调用】这个过程,也就是说从上下文从 调用函数 切换到 被调用函数 的过程。如果你传指针,只是穿一个地址过去,一般为4字节(32位计算机),而传一个结构体的变量通常要大于4字节,而且是远大于。对于你这样的设计,也就是

struct A
    int num;
;

是很少见的。因为这没必要。

上面说的快指的就是传值的快慢了。(这就相当于送信。一个是直接通过电子邮件把信的内容告诉别人了,而另一个还要快递员把信过去)


但在你的程序中,为什么传指针反倒比传值慢呢?

正如开头就说了,你进行了大量的计算,每一次计算都要对结构体里面的成员进行操作。

这样为什么慢呢,原因就在于传指针给 被调用函数 之后,被调用函数里的局部变量

int fun(A* a)

也就是a实际上是一个指针,它指向了这个结构体。但是,如果你想操作这个结构体的变量,必须要进行解引用,也就是 (*a). 这样一个操作,这个操作在cpu看来,就是知道某个变量的地址存在哪里,cpu得到这个地址上去才能找这个变量实际所处的地址。

这里可能有点混乱,注意理解指针的概念。

这样就增加了一个寻址的过程。

而如果是

int fun(A a)

这里的a就代表着这个结构体的实际地址,那么通过a. 就可以直接使用结构体的成员了。这样就没有更多的寻址的过程。


传指针每一步操作都比传值多一步寻址操作,你循环了这么多次,自然就多了很多步,浪费了很多时间。那在上面说的函数调用时节省的时间自然就被抵消了。


所以就有传指针比传结构体更慢的结果。

我最开始的回答也说了,指针传递速度快,效率高,这个快是“传递”快,而不是计算快。


如果我的回答解决了你的问题,请采纳!你的采纳是我答题的动力!

如果有问题,请追问!

参考技术A 一个传值,一个传地址,应用场景不一样,看设计了追问

有没有好的设计经验可以传授一下吗?要是用链表就只可能把下级指针往里面传,传值每次还要复制一遍内存,不知道有没有更好的方法

以上是关于用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用的主要内容,如果未能解决你的问题,请参考以下文章

C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 & ( (struct X*)0 ) -> Y)语法

结构体中的数据对齐

c语言中如何将按结构体中的某个元素大小,将结构体排序输出

关于C语言的结构体中元素的筛选,排列顺序。

指针地址和结构体中的数组

指针地址和结构体中的数组