在c中复制数组与复制int的成本和性能

我正在阅读一本关于 c 的书,以下段落对我来说有点不清楚:

令人惊讶的是,在上面的例子中传递指针效率不高!这是因为 int 类型是 4 个字节,复制它比复制其指针的 8 个字节更有效。但对于结构和数组,情况并非如此。由于复制结构和数组是按字节完成的,并且其中的所有字节都应该一个一个地复制,因此通常最好传递指针。

据我所知,CPU 中的所有操作都仅限于算术位操作,所以

作者关于复制数组和结构的意思是什么,不是一个 int 复制位移操作?

第二:是指针数组吗?

注意:书名是Extreme C,由packT出版,下面的例子是作者所指的:

#include <stdio.h>
void func(int* a) {  
int b = 9;
*a = 5;  a = &b; 
}
int main(int argc, char** argv) {  
int x = 3;
int* xptr = &x;
printf("Value before call: %dn", x);
printf("Pointer before function call: %pn", (void*)xptr);  func(xptr);  
printf("Value after call: %dn", x);
printf("Pointer after function call: %pn", (void*)xptr);
return 0; 
}

'''

回答

书上说的不是很清楚,也是错的。

假设似乎是 8 字节指针比 4 字节整数“更难”复制。这对几乎所有现代 CPU 来说都是错误的。

此外,关于复制数组的部分完全是错误的。这不是 C 所做的。在 C 中传递数组不涉及副本。这实际上就像传递一个指针。

然而,关于结构的部分是正确的……只要结构不仅仅是一个简单的整数或字符,而是“更大的东西”。

作者关于复制数组的意思是什么

听起来像垃圾......因为C不会通过复制来传递数组

作者关于复制......结构的意思是什么,

结构是按值复制的。因此,将结构传递给函数涉及复制结构的每个字节。如果结构很大,那是相当昂贵的。

是指针数组吗?

不。指针就是指针。但是...在正确的情况下,指针可以用作数组,因为*(p + i)p[i]


以上是在c中复制数组与复制int的成本和性能的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>