c++的函数需要返回数组,但是长度不定,应该怎样书写代码?
返回值的长度可能很大,也可能很短。但是在函数里面能够以【常数级】复杂度【先计算出】返回值的长度。(注意!【仅】在函数里面能这样计算,函数外面算不出来)我希望不要浪费空间,...
返回值的长度可能很大,也可能很短。
但是在函数里面能够以【常数级】复杂度【先计算出】返回值的长度。(注意!【仅】在函数里面能这样计算,函数外面算不出来)
我希望不要浪费空间,并且要保证缓冲区的大小足够
要求返回的结果能够随机访问
(以int为例)
不要用std::vector<int>,因为大小比实际略大,空间上有浪费;
不要用std::list<int>,因为不能随机访问
我不希望使用的写法:
int result[MAX_SIZE];//先分配一个缓冲区
int actualSize;
void Func(int *pRet, int maxSize, int *pActualSize){……}
Func(result, MAX_SIZE, &actualSize);
不希望这样写的原因:我已经说过长度不定,所以MAX_SIZE可能仍然不够用(很严重的问题),也可能浪费许多空间(可能是较严重的问题,有可能是小问题)。
下面这种写法可以实现,但是每次重新分配内存比较慢。能不能优化?
int *pRet Func(int *pActualSize)
{
int size = countSize();//我说过,【能且只能】在函数里面算出返回值的大小
int *pRet = new int[size];
*pActualSize = size;
return pRet
}
int *pInfo = Func(&size);
//使用pInfo和size
delete []pInfo;
下面这种方法虽不用重新分配,但是有点浪费空间
思路:每次复用缓冲区,直到不够时再重新分配;如果缓冲区空闲太多,也重新分配
/*全局变量*/
int *g_pBuf = NULL;
int g_size = 0;
void Func(int *pActualSize)
{
int size = countSize();
g_size < size://缓冲区不够
g_pBuf = realloc……
g_size > ½size //缓冲区的一半都空闲了
g_pBuf = realloc……
……
}
各位怎么看?在必须保证空间足够的前提下,应该怎样权衡相关因素?怎样书写代码? 展开
但是在函数里面能够以【常数级】复杂度【先计算出】返回值的长度。(注意!【仅】在函数里面能这样计算,函数外面算不出来)
我希望不要浪费空间,并且要保证缓冲区的大小足够
要求返回的结果能够随机访问
(以int为例)
不要用std::vector<int>,因为大小比实际略大,空间上有浪费;
不要用std::list<int>,因为不能随机访问
我不希望使用的写法:
int result[MAX_SIZE];//先分配一个缓冲区
int actualSize;
void Func(int *pRet, int maxSize, int *pActualSize){……}
Func(result, MAX_SIZE, &actualSize);
不希望这样写的原因:我已经说过长度不定,所以MAX_SIZE可能仍然不够用(很严重的问题),也可能浪费许多空间(可能是较严重的问题,有可能是小问题)。
下面这种写法可以实现,但是每次重新分配内存比较慢。能不能优化?
int *pRet Func(int *pActualSize)
{
int size = countSize();//我说过,【能且只能】在函数里面算出返回值的大小
int *pRet = new int[size];
*pActualSize = size;
return pRet
}
int *pInfo = Func(&size);
//使用pInfo和size
delete []pInfo;
下面这种方法虽不用重新分配,但是有点浪费空间
思路:每次复用缓冲区,直到不够时再重新分配;如果缓冲区空闲太多,也重新分配
/*全局变量*/
int *g_pBuf = NULL;
int g_size = 0;
void Func(int *pActualSize)
{
int size = countSize();
g_size < size://缓冲区不够
g_pBuf = realloc……
g_size > ½size //缓冲区的一半都空闲了
g_pBuf = realloc……
……
}
各位怎么看?在必须保证空间足够的前提下,应该怎样权衡相关因素?怎样书写代码? 展开
3个回答
展开全部
我的建议是题主不要在函数没有实现之前就担心这么多问题。
这种内存分配的问题是从计算机出现以来就一直在被研究的,题主不太可能短时间内想到什么创新的策略。
我认为比较好的一种工程思路是,当问题出现了以后再去解决。如果题主没有在实际中遇到问题,就先暂时不用费这么多脑筋。
追问
我已经遇到问题了。我只不过是把和具体情境无关的东西抽象出来再问
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是的 没错 我也不知道 只是做任务
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询