C Vaxocentrist 中数组的 memcpy 是什么?

Is memcpy of array in C Vaxocentrist?

C 中一个数组块到另一个数组的 memcpy 是否有罪Vaxocentrism

示例:

double A[10];
double B[10];
// ... do stuff ...
// copy elements 3 to 7 in A to elements 2 to 6 in B
memcpy(B+2, A+3, 5*sizeof(double)

作为一个相关问题,是从数组转换为指针 Vaxocentrist 吗?

char A[10];
char* B = (char*)A;
B[0]=2;
A[1]=3;
B[2]=5;

我当然很欣赏编写在不同机器体系结构和不同编译器下工作的代码的想法,但如果我将类型安全应用到极致,它会削弱 C 的许多有用功能!关于编译器如何实现 arrays/pointers/etc.?

我可以假设多少/多少

在 C 代码中,memcpy() 在某些情况下可能是一种有用的优化。首先,如果内存数组非常小,那么复制操作通常可以由编译器直接内联,而不是调用函数。在运行很多的紧密循环中,这可能是一个巨大的胜利。其次,在数组非常大并且硬件支持针对某些对齐内存情况的更快内存访问模式的情况下,那么更快的代码可以用于绝大多数内存。你真的不想知道不同硬件的对齐和复制操作的可怕细节,最好把那些东西放在 memcpy() 中让每个人都使用它。

没有。 memcpy 工作的模型是在 C 语言标准指定的抽象机中定义的,与它可能 运行 所在的任何特定物理机无关。特别是,C 中的所有对象都有一个 表示 ,它被定义为类型 unsigned char[sizeof object] 的覆盖数组,并且 memcpy 适用于此表示。

同样,'decay'数组通过强制转换或隐式转换指向指针,完全在抽象机上定义,与物理机无关。

此外,链接文章中的第 1-14 点 none 与您询问的代码有关。

对于第一个示例,您错误地使用了 + 运算符。你想尊重它指向的元素。这是安全的,因为两个数组的大小都是 10,并且在为数组分配内存时,所有地址相对于元素 0 都是连续的。此外,您正在复制的内容不会超出您正在复制的已声明数组的范围对,B.

memcpy(&B[2], &A[3], 5*sizeof(double));

关于你的相关问题,你犯了同样的错误,你想做以下事情:

char A[10];
char* B = &A[0];
B[0]=2;
A[1]=3;
B[2]=5;