我想知道将两个不同的数组组合成一个更大的数组的最快(或非常快)的方法是什么.举个简单的例子,假设我想组合初始化的数组int smallArray0[3]int smallArray1[2].

例如,我可以通过mallocs,memcpys和frees使用指针,但我的印象是(如果我错了,请纠正我)将所有内容都保存在堆栈中(对于较小的数据量)更快.因此,我们不要使用动态分配.

如果我想要实际复制数据,我只能考虑声明一个int biggerArray[5]并使用for/While循环来填充它,如下所示:

for (int i = 0; i < 3; i++)
    biggerArray[i] = smallerArray0[i];
for (i = 3; i < 5; i++)
    biggerArray[i] = smallerArray1[i - 3];

有没有一种方法,不需要复制数据,而是有某种指针,顺序地指向smallArray0的所有元素,最后指向smallArray1?如果可以的话,这样会更快吗?

我希望这是有道理的,如果没有,我很乐意澄清.

推荐答案

感谢所有人的大量输入,我确实学到了大量关于C语言和数组的底层 struct 的知识.看起来memcpy(带或不带偏移量)似乎是最快的方法,尤其是因为至少glibc implementation of memcpy可以逐字复制而不是逐字节复制,而且正如Ludin的注释所提到的那样,使用for循环复制数组经常会产生与使用memcpy相同的机器代码(当然,这取决于编译器).

C++相关问答推荐

Malloc(sizeof(char[Length]))是否不正确?

为什么在C中进行大量的位移位?

在 struct 中强制转换空指针

C中函数类型的前向声明

为什么我不能只在内存地址中添加一个int来寻址任何数组?

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

为什么中断函数会以这种方式影响数组?

如何在GDB中查看MUSL的源代码

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

使用ld将目标文件链接到C标准库

运行时错误:在索引数组时加载类型为';char';`的空指针

如何使这个While循环在新行上结束

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

C语言中的指针和多维数组

分支预测和UB(未定义的行为)

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

在链表中插入一个值

如何向 execl 创建的后台程序提供输入?

GDB 用内容初始化数组

C simd _m128 晶圆厂