Potrzebuję porównać blok pamięci do stałej wartości w C. Czy mogę to zrobić z memcmp? Coś jak:memcmp, ale trzeba porównać blok o ustalonej wartości
memcmp (starting_address, fixed_value, num_byte)
muszę fixed_value być ustalona wartość nie adres początkowy bloku.
- Zapisywanie stałej wartości do całego bloku pamięci tymczasowej nie jest opcją, ponieważ mam ograniczoną przestrzeń.
- Używanie pętli do zapisywania i sprawdzania pamięci jeden po drugim nie jest opcją, ponieważ jest bardzo powolne.
Jeśli nie jest możliwe, czy ktoś może mi powiedzieć rozwiązanie, które jest tak szybkie (lub szybsze) niż memcmp?
Dzięki,
EDIT: załóżmy, że mam 5GB pamięci, który przechowuje 0 tych. Próbuję się upewnić, że wszystkie są zerowe. Czy można bezpiecznie sprawdzić pierwszy bajt bloku, wykonaj następujące czynności:
memcmp (adres początkowy, adres_początkowy + ONE_BYTE, FIVE_GB); ?
EDIT: To dlatego muszę korzystać memcmp a nie zdefiniowane przez użytkownika pętli:
Kod ten wziął 546 zegar tyka uruchomić:
memset(0x80000000 , 0x1 , 0x10000000);
memset(0x90000000 , 0x1 , 0x10000000);
memcmp(0x80000000 , 0x90000000 , 0x10000000);
vs tego, które miało 7669 zegar tyka:
unsigned int i;
int flag = 0;
int *p = 0x80000000;
int *q = 0x90000000;
while(p < 0x90000000)
{
if(*p++ != *q++)
{
flag = 1;
}
}
"Używanie pętli do zapisywania i sprawdzania pamięci jeden po drugim nie jest opcją, ponieważ jest bardzo powolne." Jak myślisz, co "memcmp" zamierza zrobić? –
Czy próbowałeś czasu, aby zobaczyć, jak długo 'memcmp' ma w porównaniu do pętli' for', którą sam napisałeś, zanim doszedłeś do wniosku, że 'memcmp' jest szybsze? Czy próbowałeś czytać i porównywać bloki 32 lub 64 bitów naraz w pętli 'for'? – AusCBloke
@CarlNorum: W moim odczuciu pętle nie są nawet bliskie wydajności memcmp/memcpy. Współczesne procesory mają wydajne instrukcje do obsługi danych w pamięci (REP MOVSB przychodzi na myśl) i dodatkowe obciążenie pętli. W ASMie wciąż istnieją jeszcze szybsze sposoby, ponieważ memcmp/memcpy jest przeznaczony do obsługi ogólnych przypadków, np. Gdy pamięć nie jest wyrównana do DWORD. –