2D char数组或1D数组到char指针的速度更快?

时间:2019-03-26 04:32:43

标签: c arrays dynamic

我只需要知道哪个数组更快:2D char数组或1D数组以char指针。

例如:

char* name1[]={"Marc", "Jean-Marie", "Paul", ...}
char name2[][11]={"Marc", "Jean-Marie", "Paul", ...}

如果我有相同的代码可以对这些数组进行排序,那么可以更快地完成这些数组?

2 个答案:

答案 0 :(得分:3)

排序第二个变量将需要使用中间缓冲区或基于字节/基于块的交换的字符串副本。这可能比简单移动指针“要慢”。

相反,使用指向实际字符串文字的指针意味着仅在排序时交换指针。因此,这可能会“更快”。

此外,很可能,您的字符串文字将被编译器更紧密地包装在内存中,这可以帮助缓存性能,假设您实际上想对比3更大数量的字符串进行排序。

但是,您给出的示例。这还不是很清楚。在具有较大本机类型(例如,指针或特殊的SIMD增强)的系统上,完全有可能将2D数组中的字符串交换优化为几乎无法测量差异的程度。尽管这高度依赖于基础内存体系结构以及它是否在乎对齐。

最后一点是,如果您有非常大的2D数组,则可能需要静态分配或在堆上分配,因为它可能不适合堆栈。

当然,只有在非常大的阵列大小时,您才可能开始看到可测量的差异。使用包含3个字符串的示例非常荒谬。

答案 1 :(得分:0)

首先,对于这么少的元素,这确实没有关系。两者都一样快。

但是,如果数组中有大量元素,则需要查看缓存访问。

对于name1,您有一个数组或指针。指针本身指向存储字符串文字"Marc" Jean-Marie"等的其他位置。这可能会导致无法正确缓存阵列。

对于name2,将字符串"Marc"等复制到数组中。这对于缓存可能更容易。但是,请注意,如果阵列很大,第二种方法将导致更多使用RAM。