我只需要知道哪个数组更快:2D char数组或1D数组以char指针。
例如:
char* name1[]={"Marc", "Jean-Marie", "Paul", ...}
char name2[][11]={"Marc", "Jean-Marie", "Paul", ...}
如果我有相同的代码可以对这些数组进行排序,那么可以更快地完成这些数组?
答案 0 :(得分:3)
排序第二个变量将需要使用中间缓冲区或基于字节/基于块的交换的字符串副本。这可能比简单移动指针“要慢”。
相反,使用指向实际字符串文字的指针意味着仅在排序时交换指针。因此,这可能会“更快”。
此外,很可能,您的字符串文字将被编译器更紧密地包装在内存中,这可以帮助缓存性能,假设您实际上想对比3更大数量的字符串进行排序。
但是,您给出的示例。这还不是很清楚。在具有较大本机类型(例如,指针或特殊的SIMD增强)的系统上,完全有可能将2D数组中的字符串交换优化为几乎无法测量差异的程度。尽管这高度依赖于基础内存体系结构以及它是否在乎对齐。
最后一点是,如果您有非常大的2D数组,则可能需要静态分配或在堆上分配,因为它可能不适合堆栈。
当然,只有在非常大的阵列大小时,您才可能开始看到可测量的差异。使用包含3个字符串的示例非常荒谬。
答案 1 :(得分:0)
首先,对于这么少的元素,这确实没有关系。两者都一样快。
但是,如果数组中有大量元素,则需要查看缓存访问。
对于name1
,您有一个数组或指针。指针本身指向存储字符串文字"Marc"
Jean-Marie"
等的其他位置。这可能会导致无法正确缓存阵列。
对于name2
,将字符串"Marc"
等复制到数组中。这对于缓存可能更容易。但是,请注意,如果阵列很大,第二种方法将导致更多使用RAM。