Memcpy:添加int偏移量

Memcpy : Adding an int offset?

本文关键字:偏移量 int 添加 Memcpy      更新时间:2023-10-16

我查看了一些C++代码,发现了这个memcpy函数。我理解memcpy的作用,但他们在源代码中添加了一个int。我试着查找memcpy的源代码,但似乎不明白添加对memcpy函数的实际作用。

memcpy(Destination, SourceData + intSize, SourceDataSize);

换句话说,我想知道SourceData+intSize在做什么。(我正在尝试将其转换为java。)

编辑:

因此,这里是我尝试在java中使用for循环来执行memcpy函数。。。

for(int i = 0 ; i < SourceDataSize ; i ++ ) {
      Destination[i] = SourceData[i + 0x100];
}

这与是一样的

memcpy(&Destination[0], &SourceData[intSize], SourceDataSize);

这是基本的指针运算。SourceData指向某个数据类型,在其中添加n会使其指向的地址增加n*sizeof(*SourceData)。

例如,如果SourceData定义为:

uint32_t *SourceData;

sizeof(uint32_t) == 4

则将2添加到SourceData将使其所保持的地址增加8。

顺便说一句,如果SourceData被定义为一个数组,那么向其中添加n有时与访问数组的第n个元素相同。对于n=0,这很容易看到;当n==1时,很容易看出您将访问数组开始后大小为(*SourceData)字节的内存地址。

SourceData+intSize正在跳过SourceData开头的intSize*sizeof(源数据类型)字节。也许SourceDataSize存储在那里或者类似的东西。

在Java中,最接近memcpy的等价物可能是System.arraycopy,因为Java实际上没有相同意义上的指针。

添加将更改用于内存副本源的地址。

地址更改的数量将取决于SourceData的类型。

(请参见http://www.learncpp.com/cpp-tutorial/68-pointers-arrays-and-pointer-arithmetic/)

它可能试图复制数组SourceData的一个部分,该部分从偏移量intSize开始,长度为SourceDataSize/sizeof(*SourceData)。

编辑

因此,例如,如果数组是4字节大小的整数,那么等效的java代码将如下所示:

for(int i = 0 ; i < SourceDataSize/4 ; i ++ ) {
  Destination[i] = SourceData[i + intSize];
}

关于在Java中执行此操作:

您的环路

for(int i = 0 ; i < SourceDataSize ; i ++ ) {
      Destination[i] = SourceData[i + 0x100];
}

将始终开始将数据从0x100元素复制到SourceData中;这可能不是期望的行为。(例如,当i=0Destination[0] = SourceData[0 + 0x100];等等时。)如果您从不想复制SourceData[0]..SourceData[0xFF],这将是您想要的,但请注意,硬编码可以防止它成为memcpy的替代品。

在原始代码中指定intSize值的原因可能是因为第一个intSize元素不是"实际"数据的一部分,并且这些字节以某种方式用于记账(就像记录缓冲区的总大小一样)。memcpy本身看不到偏移量;它只知道从哪个指针开始。CCD_ 10创建将CCD_ 11字节指向CCD_ 12之后的指针。

但是,更重要的是,您正在做的事情可能非常缓慢。memcpy是一个非常优化的函数,在大多数体系结构上映射到经过仔细调优的汇编,用简单的每字节循环迭代取代它将极大地影响代码的性能特征。如果您想了解memcpy和指针是如何工作的,请注意,如果您想将现有代码移植到Java以供实际使用,您可能希望使用一个道德上等效的Java函数,如java.util.Arrays.copyOf