您在增长缓冲区中使用的var类型

时间:2011-10-11 19:26:34

标签: c malloc

我需要从套接字流中读取一些字节。 不,我这样做一个扩展缓冲区:

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);

还有其他任何优化吗?

由于

2 个答案:

答案 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更快(很可能不是) - 对两种变体进行分析并选择最快(或确认)他们有相同的效率。)