System.arraycopy() 等效于 C、C++ 或 Objective-C

Posted

技术标签:

【中文标题】System.arraycopy() 等效于 C、C++ 或 Objective-C【英文标题】:System.arraycopy() equivalent in C, C++ or Objective-C 【发布时间】:2015-03-21 18:42:44 【问题描述】:

我正在将一个 android 应用程序 (java) 移植到 ios 应用程序。一部分是实时显示图。

我使用此代码将值插入到数组中的索引 0:

public double[] points;
.....
//Clear array value at first index
System.arraycopy(points, 0, points, 1, points.length - 1);
//Add new value to first index
points[0] = sample;

对此有一些疑问,但对我的情况没有用。

我可以使用 NSMutableArray 和 NSNumber 来获得结果,但它需要更多的代码,然后是 CPU

【问题讨论】:

请选择a目标语言。 我会使用std::vector 代替您的阵列并使用std::vector::insert() 这可能有用:C and C++ equivalent to Java's System.arraycopy @WhozCraig 如果它可以解决我的问题,我可以使用任何东西,c、c++ 和 Objective-c 可以与 Xcode 一起使用。 【参考方案1】:

在 C 中,一开始会这样做:

size_t n_points = 512;
double *points = calloc(512, sizeof(double));

那么逻辑是:

memmove(points + 1, points, n_points - 1);
*points = sample;

虽然更好的是使用环形缓冲区 - 所以不要在缓冲区周围移动值,只需移动被认为是开始的索引:

size_t n_points = 512;
double *points = calloc(512, sizeof(double));
ssize_t beginning = 0;

if (--beginning < 0) 
    beginning += n_points;

points[beginning] = sample;

然后在绘制代码中:

ssize_t idx, i;
for (idx = beginning, i = 0;
     i < n_points;
     i ++, idx = (idx + 1) % n_points)

    // i runs from 0 ... n_points - 1
    set_pixel(i, points[idx], black);

【讨论】:

感谢您的解决方案。 我像下面这样编辑您的代码,它工作正常:#define MAXPOINTS 200;双点[MAXPOINTS]; memmove(点 + 1, 点, MAXPOINTS - 1);点[0] = 样本;而且我不知道为什么有些人不赞成我! 一些注意事项:如果您使用 calloc() 或 malloc() 自己创建内存缓冲区,ARC 不会为您释放它。完成缓冲区后,您必须确保调用 free()。此外,环形缓冲区会覆盖自身,并且最旧的值会丢失。最后,像这样的环形缓冲区的大小是固定的。你不能稍后决定让它更大(好吧,你可以通过添加额外的逻辑和 realloc 调用,但这是另一回事。) 如果您可以在 C 中使用指针并自己管理内存,并且不需要动态调整缓冲区大小,那么这种方法很好,并且应该比在 Objective 中处理 NSArrays 更快-C. @DuncanC Java 中的double[] 也不能调整大小 - 您需要分配一个新数组并在那里复制内容。【参考方案2】:

C++ 中,我很想用 std::vector 代替您的 Java 数组:

#include <vector>
#include <iostream>

int main()

    struct point
    
        int x, y;
        point(int x, int y): x(x), y(y) 
    ;

    std::vector<point> points;

    point sample 2, 7;

    points.insert(points.begin(), sample); // insert at beginning
    points.insert(points.begin(), 9, 3);
    points.insert(points.begin(), 4, 8);

    points.push_back(sample); // insert at end

    for(auto p: points)
        std::cout << "" << p.x << ", " << p.y << "" << '\n';

如果你做了很多很多,如果在开头插入std::deque 可能值得一看。

参考:How a std::vector works

【讨论】:

【参考方案3】:

在 Obective-C 中,您可以使用 NSMutableArray 方法在索引 0 处插入项目。

 - (void)insertObject:(id)anObject atIndex:(NSUInteger)index

【讨论】:

正如我从一开始就提到的,我尝试过 NSMutableArray 但它对 cpu 不利 “它对 CPU 不利”是什么意思?您是否实现了等价物,发现它太慢了,对其进行了分析,并确定 NSArray insertObject:atIndex: 是花费所有额外时间的方法? @Duncan C:感谢您的回答,但 Antti Haapala 为我工作,它只使用 4 行代码而且速度很快。 @DzungPV,如果你打算使用手动分配的内存和 C 风格的数组,很好。这种方法与 Java 的垃圾收集、无指针风格差不多,但无需编写汇编程序即可获得。您还需要知道内存管理取决于您。完成后必须释放缓冲区(本例中的点),否则会导致内存泄漏。【参考方案4】:

通过 Google 的快速搜索,看起来 System.arrayCopy() 将源数组的子集复制到目标数组中。

听起来你希望你的新数组是一个 NSMutableArray,并且想要使用 - insertObjects:atIndexes:。该方法将 NSIndexSet 作为输入。您可以使用 NSIndexSet 方法indexSetWithIndexesInRange 从一系列索引中创建索引集。

【讨论】:

以上是关于System.arraycopy() 等效于 C、C++ 或 Objective-C的主要内容,如果未能解决你的问题,请参考以下文章

System.arraycopy 不抛出 ArrayIndexOutOfBoundsException

System.arraycopy 和Arrays.copyOf

Java 学习笔记 System.arraycopy 复制数组

有啥理由更喜欢 System.arraycopy() 而不是 clone()?

Java System.arraycopy

system.arrayCopy