【问题标题】:Memcpy : Adding an int offset?Memcpy:添加一个 int 偏移量?
【发布时间】:2012-02-24 20:25:26
【问题描述】:

我在查看一些 C++ 代码时遇到了这个 memcpy 函数。我了解 memcpy 的作用,但他们在源代码中添加了一个 int 。我尝试查找 memcpy 的源代码,但我似乎无法理解添加对 memcpy 函数的实际作用。

memcpy(Destination, SourceData + intSize, SourceDataSize);

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

编辑:

所以这是我尝试使用 for 循环在 java 中执行 memcpy 函数...

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

【问题讨论】:

  • 跟memcpy无关,只是很基础的指针运算
  • 如何从语言A转换为完全不相关的语言B:1)理解原始代码应该做什么; 2) 理解原始代码是如何做它应该做的; 3) 弄清楚如何用 B 语言完成; 4) 编写代码。这个问题似乎缺少步骤#1 和#2。你很难得到好的答案。
  • @R.Martinho,理解代码应该做什么的一种方法是弄清楚它做什么。因此,我认为这个问题是为了完成第 1 步。
  • @R.MartinhoFernandes 真的吗?因为我很确定我明确表示我不明白它在做什么。那么问题来了?

标签: c++ c memcpy


【解决方案1】:

与以下内容相同:

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

【讨论】:

    【解决方案2】:

    这是基本的指针运算。 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) 个字节的内存地址。

    【讨论】:

      【解决方案3】:

      SourceData + intSize 在 SourceData 的开头跳过 intSize * sizeof(source data type) 字节。也许 SourceDataSize 存储在那里或类似的东西。

      【讨论】:

        【解决方案4】:

        在 Java 中,您可能会得到最接近 memcpy 的等价物是 System.arraycopy,因为 Java 并没有真正意义上的指针。

        【讨论】:

          【解决方案5】:

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

          地址更改的数量取决于 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];
          }
          

          【讨论】:

            【解决方案6】:

            关于在 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],这将是您想要的,但请注意,硬编码可以防止它成为替代内存。

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

            但是,更重要的是,您正在执行的操作可能非常缓慢memcpy 是一个非常高度优化的函数,它映射到大多数架构上经过仔细调整的程序集,并且用简单的每字节循环迭代替换它将极大地影响代码的性能特征。虽然如果您试图了解 memcpy 和指针的工作原理,那么您正在做的事情是合适的,但请注意,如果您尝试将现有代码移植到 Java 以供实际使用,您可能希望使用道德上等价的类似java.util.Arrays.copyOf的Java函数。

            【讨论】:

              猜你喜欢
              • 2014-09-24
              • 1970-01-01
              • 2011-07-25
              • 1970-01-01
              • 2022-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多