我需要从套接字流中读取一些字节。 不,我这样做一个扩展缓冲区:
long curbufsize = 1024*24;
long expand = 1024*24;
void *buf = xmalloc(curbufsize);
void *buf_ptr_start = buf;
char mem[1024*24];
while (rc = my_read_from_stream(handle, mem, sizeof(men)) {
len = (int)buf-((int)buf_ptr_start+rc);
if(curbufsize < len) {
curbufsize+=expand;
xrealloc(buf_ptr_start, curbufsize);
}
memcpy(buf, mem, rc);
}
我应该在哪里使用size_t和long / int? bufferize应该是size_t吗? 我应该更好地为新的len计算写一下:
len = (size_t)buf-((size_t)buf_ptr_start+rc);
还有其他任何优化吗?
由于
答案 0 :(得分:2)
使用int
这种方式不正确,因为int
可能小于系统的指针大小,因此会导致截断。我使用size_t
来跟踪您当前的缓冲区大小,并且不需要任何指针算法。
重新分配也完全被打破了。为什么要调用xrealloc()
然后忽略返回值。这就像free()
的泄漏版本!
你可以这样写:
size_t len = 0;
size_t size = 0;
size_t expand = 1024*24;
char *buf = NULL;
char *newbuf;
char mem[1024*24];
while (rc = my_read_from_stream(handle, mem, sizeof(men)) {
if (size < len+rc) {
while (size < len+rc)
{
size += expand;
}
newbuf = xrealloc(buf, size);
if (!newbuf)
{
free(buf);
return ERROR_MEMORY_ALLOCATION_FAILED;
}
buf = newbuf;
}
memcpy(buf+len, mem, rc);
len += rc;
}
答案 1 :(得分:0)
您可以查看声明xmalloc
的头文件;它的参数类型必须就在那里。虽然你的代码看起来并不是在编写便携式应用程序,但你可能不需要担心这些选择。
修复错误。
修改:看到你谈到优化,考虑到int
可能比size_t
更快(很可能不是) - 对两种变体进行分析并选择最快(或确认)他们有相同的效率。)