Memcpy:添加int偏移量
Memcpy : Adding an int offset?
我查看了一些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=0
、Destination[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
。
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 编译器在构造函数中计算的成员偏移量不正确
- 使用基地址和偏移量获取变量的地址
- c++ 读取进程内存基址 + 偏移量不起作用
- 通过其在 C 中的偏移量调用函数
- ld:无效的字符串偏移量...对于".strtab"部分
- Memcpy:添加int偏移量
- fseeko的性能(FILE*流,off_t偏移量,int where)