Tôi cần so sánh khối bộ nhớ với giá trị cố định trong C. Tôi có thể thực hiện việc này với memcmp không? Một cái gì đó như:memcmp nhưng cần so sánh khối với giá trị cố định
memcmp (starting_address, fixed_value, num_byte)
Tôi cần fixed_value trở thành một giá trị cố định không phải là địa chỉ bắt đầu của một khối.
- Viết giá trị cố định cho toàn bộ khối bộ nhớ tạm thời không phải là tùy chọn vì tôi có không gian hạn chế.
- Sử dụng vòng lặp để ghi và kiểm tra từng bộ nhớ một không phải là một tùy chọn vì nó rất chậm.
Nếu không ai có thể cho tôi biết giải pháp nhanh (hoặc nhanh hơn) so với memcmp?
Cảm ơn,
CHỈNH SỬA: Giả sử tôi có 5GB bộ nhớ chứa 0. Và tôi đang cố gắng đảm bảo tất cả đều là 0. Có an toàn để kiểm tra byte đầu tiên của khối sau đó thực hiện điều này:
memcmp (starting_address, starting_address + ONE_BYTE, FIVE_GB); ?
EDIT: Đây là lý do tại sao tôi cần phải sử dụng memcmp và không phải là một người sử dụng được xác định vòng lặp:
Mã này mất 546 clock để chạy:
memset(0x80000000 , 0x1 , 0x10000000);
memset(0x90000000 , 0x1 , 0x10000000);
memcmp(0x80000000 , 0x90000000 , 0x10000000);
vs cái này mà mất 7669 clock:
unsigned int i;
int flag = 0;
int *p = 0x80000000;
int *q = 0x90000000;
while(p < 0x90000000)
{
if(*p++ != *q++)
{
flag = 1;
}
}
"Sử dụng vòng lặp để viết và kiểm tra bộ nhớ từng người một không phải là một tùy chọn vì nó rất chậm". Bạn nghĩ 'memcmp' sẽ làm gì? –
Bạn đã thử thời gian để xem 'memcmp' mất bao lâu so với vòng lặp' for' bạn đã tự viết trước khi bạn đi đến kết luận rằng 'memcmp' nhanh hơn? Bạn đã thử đọc và so sánh các khối 32 hoặc 64 bit tại một thời điểm trong một vòng lặp 'for'? – AusCBloke
@CarlNorum: Đối với các vòng lặp không gần với hiệu suất memcmp/memcpy trong kinh nghiệm của tôi. Bộ vi xử lý hiện đại có hướng dẫn hiệu quả để xử lý dữ liệu trong bộ nhớ (REP MOVSB đến với tâm trí) và có thêm chi phí vòng lặp. Có những cách nhanh hơn vẫn còn trong asm, kể từ memcmp/memcpy được thiết kế để xử lý các trường hợp chung chung, như khi bộ nhớ liên quan không phải là DWORD liên kết. –