2012-02-24 59 views
2

我正在查看一些C++代码,并且遇到了这个memcpy函数。我了解memcpy的作用,但是他们向源添加了一个int。我试图查找memcpy的源代码,但我似乎无法理解添加实际上对memcpy函数做了什么。Memcpy:添加一个int偏移量?

memcpy(Destination, SourceData + intSize, SourceDataSize); 

换句话说,我想知道SourceData + intSize在干什么。 (我想这个转换成Java。)

编辑:

所以这是我在尝试使用for循环在java中做一个memcpy函数...

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

这与memcpy无关,它只是非常基本的指针算术 – 2012-02-24 20:28:33

+8

如何从语言A转换为完全不相关的语言B:1)理解原代码应该做什么; 2)了解原始代码如何做它应该做的事情; 3)弄清楚在B语言中如何做到这一点; 4)编写代码。这个问题似乎缺少步骤#1和#2。你会很难得到很好的答案。 – 2012-02-24 20:28:37

+0

@ R.Martinho,理解什么代码*应该*做的一种方式是弄清楚它*做了什么*。因此,我认为这个问题是为了完成第一步。 – 2012-02-24 20:42:41

回答

9

它是同样的事情:

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

该插件会更改用于内存副本源的地址。

地址变化的数量将取决于SourceData的类型。

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

它可能试图复制的阵列SourceData的部分起始于偏移intSize和长度SourceDataSize /的sizeof(* SourceData)的。

EDIT

因此,例如,如果阵列是的大小4个字节的整数的,那么相应的Java代码将如下所示:

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

这是基本的指针算术。 SourceData指向某些数据类型,并且向其添加n会增加n * sizeof(* SourceData)指向的地址。

例如,如果SourceData被定义为:

uint32_t *SourceData; 

sizeof(uint32_t) == 4 

然后加入2至SourceData将由8.

增加它所占用的地址作为题外话,如果SourceData被定义为一个数组,那么向它添加n有时与访问数组的第n个元素相同。很容易看到n == 0;当n == 1时,很容易看到你将在数组开始后访问sizeof(* SourceData)字节的内存地址。

1

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

0

与Java最接近的memcpy相当于System.arraycopy,因为Java并没有真正的指针。在Java中

0

至于这样做:

你的循环

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

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

intSize值在原始代码中指定的原因可能是因为第一intSize元素不是“实际”的数据的一部分,这些字节被用于簿记以某种方式(像什么的总大小的记录缓冲区是)。 memcpy本身不会“看到”偏移量;它只知道它开始的指针。 SourceData + intSize创建一个指针,指向intSize字节,过SourceData

但是,更重要的是,你在做什么很可能是极其缓慢memcpy是一个严重优化的函数映射到大多数体系结构上经过仔细调优的程序集,并用一个简单的每字节循环代替它将极大地影响代码的性能特征。如果您想了解memcpy和指针的工作原理,请注意,如果您试图将现有代码移植到Java以供实际使用,那么您应该使用,您可能希望使用道德上等效的Java函数,如java.util.Arrays.copyOf