在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]