Tôi thừa hưởng đoạn mã sau:bộ nhớ bản sao hiệu quả
void *buf1 = calloc(1,total_buf_size);
//build buf1 up with memcpy
int index;
void *buf2 = buf1;
for (index = 0; index < log->numentries; index++)
{
logentry_t *entry = (logentry_t*)&log->entries[index];
memcpy(buf2,entry->entryname,sizeof(entry->entryname));
buf2 = buf2 + (int)sizeof(entry->entryname);
memcpy(buf2,&entry->entrysize,sizeof(entry->entrysize));
buf2 = buf2 + (int)sizeof(entry->entrysize);
memcpy(buf2,&entry->updatesize,sizeof(entry->updatesize));
buf2 = buf2 + (int)sizeof(entry->updatesize);
memcpy(buf2,&entry->numupdates,sizeof(entry->numupdates));
buf2 = buf2 + (int)sizeof(entry->numupdates);
int j;
for (j = 0; j < entry->numupdates; j++)
{
memcpy(buf2,&entry->offsets[j],sizeof(entry->offsets[j]));
buf2 = buf2 + (int)sizeof(entry->offsets[j]);
}
int k;
for (k = 0; k < entry->numupdates; k++)
{
memcpy(buf2,&entry->sizes[k],sizeof(entry->sizes[k]));
buf2 = buf2 + (int)sizeof(entry->sizes[k]);
}
memcpy(buf2,entry->data,entry->updatesize);
}
Tôi có một nhật ký giao dịch mà tôi đang lặp lại qua và cần phải viết các dữ liệu cho mỗi mục đăng nhập vào một dòng trong một tập tin. Hiện nay nó đang sử dụng memcpy để xây dựng một bộ đệm của tất cả các mục và viết tất cả cùng một lúc vào tập tin. Có cách nào tốt hơn để sao chép và mở rộng bộ nhớ vào buf2?
Văn bản có phải là văn bản không? Bạn có thể 'fprintf' một dòng cho mỗi mục nhập nhật ký? –
nhập-> dữ liệu là một khoảng trống, vì vậy tôi không thể đảm bảo nó sẽ là một chuỗi, mặc dù trong trường hợp này, tôi nghĩ rằng sẽ làm việc. Cám ơn vì sự gợi ý. – dhysong
Tôi nghĩ rằng bất kỳ loại sao chép nào cũng đủ hiệu quả để ghi nhật ký trên đĩa. Nếu bạn đang nói về khả năng đọc mã, thì có một số phòng để cải thiện. Ngoài ra, ngay cả khi nó không phải là văn bản (và nó có vẻ là không), bạn có thể không thu thập các bộ đệm mình, nhưng để cho 'fwrite()' làm đệm công việc cho bạn. – user3125367