What var type you use on growing buffers [closed]
I need to read some bytes from a socket stream. No i do a expanding buffer like this:
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);
}
where should i use size_t and long/int? Should the buffersize be a size_t? Should i better write for the new len calculation:
len = (size_t)buf-((size_t)buf_ptr_start+rc);
Any other optimization?
Thanks
Using int
this way is incorrect since int
may be smaller than the pointer size of your system and will thus lead to truncation. I'd use size_t
to keep track of your current buffer size and there's no need for any pointer arithmetic.
The reallocation is also completely broken. Why are you calling xrealloc()
and then ignoring the return value. That's like a leaking version of free()
!
You could write it something like this:
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;
}
You can look in the header file that declares xmalloc
; the type of its parameter must be right there. Though by the look of your code you are not trying to write a portable application, so you probably don't need to worry about such choices.
Just fix the bugs.
Edit: seeing that you talk about optimization, take into account that int
might be faster than size_t
(most probably it isn't) - profile the two variants and choose the fastest (or acknowledge that they have the same efficiency).
精彩评论