数组的memcpy是C Vaxocentrist中的吗?

数组的memcpy是C Vaxocentrist中的吗?,c,arrays,type-safety,C,Arrays,Type Safety,C中一个数组块到另一个数组块的memcpy是否有罪 例如: 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) 作为一个相关的问题,从数组到指针的强制转换是VaxCenter吗 char A[10]; char* B = (char*)A; B[0]=2; A[1]=3; B[2

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

例如:

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)
作为一个相关的问题,从数组到指针的强制转换是VaxCenter吗

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

我当然很欣赏在不同的机器架构和不同的编译器下编写代码的想法,但如果我将类型安全应用到极致,它将削弱C的许多有用功能!关于编译器如何实现数组/指针等,我可以假设多少?

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

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

不。memcpy工作的模型是在C语言标准指定的抽象机器中定义的,与它可能运行的任何特定物理机器无关。特别是,C中的所有对象都有一个表示形式,它被定义为类型为unsigned char[sizeof object]的重叠数组,memcpy使用这个表示形式

同样,通过强制转换或隐式转换将数组“衰减”为指针完全是在抽象机器上定义的,与物理机器无关

此外,链接文章中的1-14点都与您所询问的代码无关。

否。memcpy工作的模型是在C语言标准指定的抽象机器中定义的,与它可能运行的任何特定物理机器无关。特别是,C中的所有对象都有一个表示形式,它被定义为类型为unsigned char[sizeof object]的重叠数组,memcpy使用这个表示形式

同样,通过强制转换或隐式转换将数组“衰减”为指针完全是在抽象机器上定义的,与物理机器无关


此外,链接文章中的1-14点与您询问的代码没有任何关系。

对于第一个示例,您错误地使用了+运算符。您希望尊重其指向的元素。这是安全的,因为两个数组的大小都是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;

对于第一个示例,您错误地使用了+运算符。您希望尊重其指向的元素。这是安全的,因为两个数组的大小都是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;

a不,不是真的。b不,不是真的。你可以看看标准,看看它是怎么说的。当然,它为编译器提供了很大的自由度,但是您必须竭尽全力才能遇到重大问题。如果你努力的话,你一定能把自己钉死;大多数人不觉得有必要那么努力;你关心的具体故障模式是什么?a不,不太关心。b不,不是真的。你可以看看标准,看看它是怎么说的。当然,它为编译器提供了很大的自由度,但是您必须竭尽全力才能遇到重大问题。如果你努力的话,你一定能把自己钉死;大多数人不觉得有必要那么努力;你关心的具体故障模式是什么?我不知道这是如何回答这个问题的。好的,简短的答案是否定的。这个描述详细说明了你不想假设的原因
关于硬件以及memcpy如何/何时可以在没有这些假设的情况下为您带来好处。我看不出这是如何回答这个问题的。好的,简短的答案是否定的。这个描述详细说明了为什么您不想假设硬件的情况,以及memcpy如何/何时可以在没有这些假设的情况下为您带来好处。“您错误地使用了+运算符”你认为呢?我使用加法运算符是合理的。指针算法允许我偏移到数组中。问题是这是否是vaxocentrist。@BigEndian有趣的是,您理解了指针衰减的概念,这使得B+2成为memcpy的有效参数,但您选择询问char*a,一个在衰减后将a转换为其现有类型的表达式,是否是vaxocentrist。对,我看到您的困惑。我知道这对我有用。我已经用C很久了。我只是不知道它是否能在另一台机器、编译器等上运行。“你不正确地使用了+运算符”你认为呢?我使用加法运算符是有道理的。指针算法允许我偏移到数组中。问题是这是否是vaxocentrist。@BigEndian有趣的是,您理解了指针衰减的概念,这使得B+2成为memcpy的有效参数,但您选择询问char*a,一个在衰减后将a转换为其现有类型的表达式,是否是vaxocentrist。对,我看到您的困惑。我知道这对我有用。我已经用C很久了。我只是不知道它是否能在另一台机器、编译器等上运行。是的,这不是列出的要点之一。这就是为什么我不确定这是否是vaxocentrist。是的,这不是列出的要点之一。这就是为什么我不确定它是否是瓦克斯中间派。