C++ 奇怪的真实行为
我正在开发一个数组结构只是为了好玩。 此结构由模板参数概括,在启动时预先分配给定数量的项,然后,如果“忙”项多于可用项,则函数将重新分配内部缓冲区。 测试代码为:C++ 奇怪的真实行为,c++,c,memory,arrays,realloc,C++,C,Memory,Arrays,Realloc,我正在开发一个数组结构只是为了好玩。 此结构由模板参数概括,在启动时预先分配给定数量的项,然后,如果“忙”项多于可用项,则函数将重新分配内部缓冲区。 测试代码为: #include <stdio.h> #include <stdlib.h> #include <string.h> template <typename T> struct darray_t { size_t items; size_t busy; T
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
template <typename T> struct darray_t {
size_t items;
size_t busy;
T *data;
};
#define DARRAY_REALLOC_ITEMS_STEP 10
#define da_size(da) (da)->busy
template <typename T>
void da_init( darray_t<T> *da, size_t prealloc ){
da->items = prealloc;
da->busy = 0;
da->data = (T *)malloc( sizeof(T) * prealloc );
}
template <typename T> T *da_next( darray_t<T> *da ){
if( da->busy >= da->items ){
da->data = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
da->items += DARRAY_REALLOC_ITEMS_STEP;
}
return &da->data[ da->busy++ ];
}
int main(){
darray_t<int> vi;
int *n;
da_init( &vi, 100 );
for( int i = 0; i < 101; ++i ){
n = da_next(&vi);
*n = i;
}
for( int i = 0; i < da_size(&vi); ++i ){
if( vi.data[i] != i ){
printf( "!!! %d != %d\n", i, vi.data[i] );
}
}
return 0;
}
#包括
#包括
#包括
模板结构darray\t{
大小项目;
大小不忙;
T*数据;
};
#定义DARRAY\u REALLOC\u项目\u步骤10
#定义数据大小(da)(da)->忙
模板
初始无效(darray,尺寸预先分配){
da->项目=预分配;
da->busy=0;
da->数据=(T*)malloc(大小(T)*预分配);
}
模板T*da\u下一步(darray\u T*da){
如果(da->忙>=da->项目){
da->data=(T*)realloc(da->data,sizeof(T)*DARRAY\u realloc\u ITEMS\u STEP);
da->items+=DARRAY\u REALLOC\u items\u步骤;
}
返回&da->data[da->busy++];
}
int main(){
darray_t vi;
int*n;
初始数据(&vi,100);
对于(int i=0;i<101;++i){
n=下一个日期(&vi);
*n=i;
}
对于(int i=0;i
如您所见,我在开始时预先分配了100个整数指针,然后一次再分配10个指针。
在main函数中,我执行for循环来检查项的完整性,如果数组项不是我期望的那样,我打印它的值并。。。你知道吗?
我有以下信息:
!!!11 != 135121
事实上,索引11的项目应该是'11',是135121!!!!:
你能告诉我我的代码是否不正确吗
谢谢
注意
我完全知道,这样混合C和C++是<强>丑陋< /强>,我也知道如果使用,这个结构会被拧紧,例如:
darray_t<std::string>
darray\t
这只是对int指针的测试。块的大小不正确:
da->data = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
整个块与增量一样大。试一试
da->busy + sizeof(T) * DARRAY_REALLOC_ITEMS_STEP
realloc不会自动增加内存—您必须这样做。例如:
da->data=(T*)realloc(da->data, sizeof(T)*(da->items+DARRAY_REALLOC_ITEMS_STEP));
(您应该处理realloc返回NULL)Ugh,C与模板,多么难看的混合。(如果我用
std::string
实例化模板,您认为会发生什么情况?)此结构不用于类,显然在这种情况下,我应该使用new操作符来alloc(调用类ctor),而我不能使用realloc。但是我重复一遍,这只是对int指针的测试。@sbi:C with templates是CUDA的一个习惯用法…但是realloc
不是那么多。仅供参考,如果你增加一个常数因子,那么你的append函数平均得到O(n),而如果你将大小增加一倍,那么你的append函数就得到摊销O(1)。@Mike:是的,但他在评论中相当明确地表示,这“只是对int指针的测试”。