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 不利”是什么意思?您是否实现了等价物,发现它太慢了,对其进行了分析,并确定 NSArrayinsertObject: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 复制数组