user-0 提问: C语言中怎么实现数组的缓存

回复:
user: user-1
content: 引用 8 楼 g360z247j123 的回复:[quote=引用 5 楼 kuangbao9 的回复:] 我记忆中数组一旦申请了维度是不能更改的。要想改变大小，可以考虑容器，像vector,list等。那可以删除和拼接。  嗯嗯，我这2天看了下链表，刚刚也看了一下vector，好像能实现数组的删除和拼接。         我要在主循环中实现每个子函数输出时数组前面的元素被删除，后面的被保留。同时在子函数的子循环中有从后面不停拼接（不停增加，但有最大长度）的，有不停删除前面部分元素（比如200）的，也有要实现先删除前面一个，接着从后面拼接进来一个的（比如开始数组大小为2，即s[2]，然后删除第一个元素，接着从后面拼接进另一个元素，不停循环，保证数组长度不变）。更具体的要求情况可以看下面我给bear234的回复。       请问 我该采用什么结构比较好[/quote]  可以看看vector的，再看看泛型算法。

user: user-2
content: 你完全可以把一个包含 500 的元素的数组看成是 5 个包含 100 的元素的数组： arr[500]; 第一个数组 &arr[0] 第二个数组 &arr[100] 第三个数组 &arr[200] 第四个数组 &arr[300] 第五个数组 &arr[400]

user: user-3
content: 引用 7 楼 g360z247j123 的回复:[quote=引用 6 楼 bear234 的回复:] [quote=引用 5 楼 kuangbao9 的回复:] 我记忆中数组一旦申请了维度是不能更改的。要想改变大小，可以考虑容器，像vector,list等。那可以删除和拼接。  realloc可以  楼主你用malloc或者calloc？ 两者区别请看：(http://zhidao.baidu.com/link?url=eyTmOA33VVDCq5Qg6O3JFEEm2Sjs0olWyNqV5Rz6Cg-Jt0y8_lpLq9qq_dlxcpPbVLxhZ6Sex1D3dZL8usDBq_)  楼主，请你先把你的算法明确，然后看下如果你用malloc或者calloc是不是太多了，如果是，我建议你直接弄个大一点的数组，不要反复malloc calloc 和 realloc，这三个东西代价比较高  当然，如果你是在做嵌入式、可用空间很有限，当我没说[/quote]  你好！关于realloc( )函数，它扩大数组空间时比较好理解，当它缩小数组空间时是怎么回事？           比如有数组int a1[500]，通过它扩大空间，p = (int *)realloc(a1,600)，假如没有发生数据搬移（即p内存储的地址和a1相同）且分配成功，相当于在原有空间后增加100个int 型元素的空间；通过它缩小空间，q= (int *)realloc(a1,100)，此时缩小损失的是前400个元素还是后400个元素？如果从a1[500]中的第401个元素a1[400]开始重新分配，即令q= (int *)realloc(&a1[400],100)，这样能保留后100个元素吗？           刚刚看了一下，整个程序是这样的。最开始输入一帧数据（数组），它的长度可变（可大可小），记为SourceLen。为说明便利同上面设定SourceLen=500，即a1[500]，然后输入给子函数Fun1，处理后依次给Fun2、Fun3...Fun10，然后主循环再次给Fun1输入新的500个数据，记为a2[500]，接着给Fun2等依次处理，再主循环......总的循环次数可能有2000甚至更多。          a1[500]经过Fun1处理后输出数组大小约为500000，记为b1[5000000]，b1经过Fun2后数组大小会变为原来的4倍，即c1[20000000]，接着传递给后面的子函数，不过数组长度不会再增加，到Fun8时开始减小，最后Fun10输出长度回归500。所有子函数输入输出数组长度的变化规律不一定相同，但都是确定的（根据算法）。至于具体长度则受SourceLen的影响。         整个程序中我准备全部采用动态内存分配，malloc( )、calloc( )等。除了子函数Fun1外都需要实现类似数组缓存的功能（即去掉前面的部分元素保留后面的元素供下次循环使用）。有些数组缓存是供下次主循环用的，有些数组缓存是供该子函数内的下次子循环用的。我该怎么定义它们，固定分配or动态分配？它们的属性：比如全局数组，局部的or静态的？        开始我是采用Matlab来仿真，不过Matlab中关于数组（一维向量）的操作真的很方便，可以随意的连续赋值，置空（删除）和拼接；但是它的仿真速度实在是太慢了（好像数组的不定长拼接很耗时间），故希望采用C语言来提高速度。。。[/quote]  如此频繁使用数组  我个人建议你可以试着用c++  c++可以重载operator new   这个技术很少会用到 算是个偏一点的技术  不过可能适合你的这个问题   反复malloc realloc 也是很占用资源的

user: user-4
content: 如果你要循环那么多次，并且申请的内存那么大的话，不建议一直malloc free，你如果知道整个过程中内存需要的最大值的话，可以在最外层malloc（max - 100）出这么多空间记为A，再malloc 出100记为B，你只要把（value - 100）前的数存到A中，把后100个数存入B中,每次取数据都是先读取在B中100个数据，再从指定的长度L-100中从A取，然后循环，记住每次要读取的长度L就行了，这样相对来说数据就不需要移动太多；

user: user-0
content: 引用 5 楼 kuangbao9 的回复:我记忆中数组一旦申请了维度是不能更改的。要想改变大小，可以考虑容器，像vector,list等。那可以删除和拼接。  嗯嗯，我这2天看了下链表，刚刚也看了一下vector，好像能实现数组的删除和拼接。         我要在主循环中实现每个子函数输出时数组前面的元素被删除，后面的被保留。同时在子函数的子循环中有从后面不停拼接（不停增加，但有最大长度）的，有不停删除前面部分元素（比如200）的，也有要实现先删除前面一个，接着从后面拼接进来一个的（比如开始数组大小为2，即s[2]，然后删除第一个元素，接着从后面拼接进另一个元素，不停循环，保证数组长度不变）。更具体的要求情况可以看下面我给bear234的回复。       请问 我该采用什么结构比较好

user: user-0
content: 引用 6 楼 bear234 的回复:[quote=引用 5 楼 kuangbao9 的回复:] 我记忆中数组一旦申请了维度是不能更改的。要想改变大小，可以考虑容器，像vector,list等。那可以删除和拼接。  realloc可以  楼主你用malloc或者calloc？ 两者区别请看：(http://zhidao.baidu.com/link?url=eyTmOA33VVDCq5Qg6O3JFEEm2Sjs0olWyNqV5Rz6Cg-Jt0y8_lpLq9qq_dlxcpPbVLxhZ6Sex1D3dZL8usDBq_)  楼主，请你先把你的算法明确，然后看下如果你用malloc或者calloc是不是太多了，如果是，我建议你直接弄个大一点的数组，不要反复malloc calloc 和 realloc，这三个东西代价比较高  当然，如果你是在做嵌入式、可用空间很有限，当我没说[/quote]  你好！关于realloc( )函数，它扩大数组空间时比较好理解，当它缩小数组空间时是怎么回事？           比如有数组int a1[500]，通过它扩大空间，p = (int *)realloc(a1,600)，假如没有发生数据搬移（即p内存储的地址和a1相同）且分配成功，相当于在原有空间后增加100个int 型元素的空间；通过它缩小空间，q= (int *)realloc(a1,100)，此时缩小损失的是前400个元素还是后400个元素？如果从a1[500]中的第401个元素a1[400]开始重新分配，即令q= (int *)realloc(&a1[400],100)，这样能保留后100个元素吗？           刚刚看了一下，整个程序是这样的。最开始输入一帧数据（数组），它的长度可变（可大可小），记为SourceLen。为说明便利同上面设定SourceLen=500，即a1[500]，然后输入给子函数Fun1，处理后依次给Fun2、Fun3...Fun10，然后主循环再次给Fun1输入新的500个数据，记为a2[500]，接着给Fun2等依次处理，再主循环......总的循环次数可能有2000甚至更多。          a1[500]经过Fun1处理后输出数组大小约为500000，记为b1[5000000]，b1经过Fun2后数组大小会变为原来的4倍，即c1[20000000]，接着传递给后面的子函数，不过数组长度不会再增加，到Fun8时开始减小，最后Fun10输出长度回归500。所有子函数输入输出数组长度的变化规律不一定相同，但都是确定的（根据算法）。至于具体长度则受SourceLen的影响。         整个程序中我准备全部采用动态内存分配，malloc( )、calloc( )等。除了子函数Fun1外都需要实现类似数组缓存的功能（即去掉前面的部分元素保留后面的元素供下次循环使用）。有些数组缓存是供下次主循环用的，有些数组缓存是供该子函数内的下次子循环用的。我该怎么定义它们，固定分配or动态分配？它们的属性：比如全局数组，局部的or静态的？        开始我是采用Matlab来仿真，不过Matlab中关于数组（一维向量）的操作真的很方便，可以随意的连续赋值，置空（删除）和拼接；但是它的仿真速度实在是太慢了（好像数组的不定长拼接很耗时间），故希望采用C语言来提高速度。。。

user: user-1
content: 我记忆中数组一旦申请了维度是不能更改的。要想改变大小，可以考虑容器，像vector,list等。那可以删除和拼接。

user: user-3
content: 引用 5 楼 kuangbao9 的回复:我记忆中数组一旦申请了维度是不能更改的。要想改变大小，可以考虑容器，像vector,list等。那可以删除和拼接。  realloc可以  楼主你用malloc或者calloc？ 两者区别请看：(http://zhidao.baidu.com/link?url=eyTmOA33VVDCq5Qg6O3JFEEm2Sjs0olWyNqV5Rz6Cg-Jt0y8_lpLq9qq_dlxcpPbVLxhZ6Sex1D3dZL8usDBq_)  楼主，请你先把你的算法明确，然后看下如果你用malloc或者calloc是不是太多了，如果是，我建议你直接弄个大一点的数组，不要反复malloc calloc 和 realloc，这三个东西代价比较高  当然，如果你是在做嵌入式、可用空间很有限，当我没说

user: user-5
content: 建议楼主学习循环FIFO缓冲区相关知识。

user: user-0
content: 引用 2 楼 u010868023 的回复:你可以在循环外面申请100个元素的空间 来保存最后100个元素  定义全局数组吗？可它怎么和新输入的500个元素拼接呢，还有对于子函数Fun2，Fun3....都要定义全局数组吗

user: user-6
content: 你可以在循环外面申请100个元素的空间 来保存最后100个元素

user: user-6
content: 你可以在循环外面申请100个元素的空间 来保存最后100个元素