95% 이해했다는 ㅇㅇ충입니다 ㅠㅠ
5% 부족한걸 나중에 다시 보면 이해하겠지 하고 넘어갔는데,
방금 다시 봤는데 이해가 안되네요 ㅜㅜ
1. src 의 정렬되기 전 앞부분 짜투리인 3바이트를 먼저 dst + 3 위치에 1 byte 단위로 복사하고 나면,
2. memcpy( dst + 6, src + 4, size - 3 ); 를 해야 되는 셈이지. ( src + 4 는 이제 정렬된거 )
3. size - 3 도 4의 배수에 맞추어야 하니까 남은 짜투리를 1 byte 단위로 복사하면 되는거구.
즉, 출발이나 도착 한쪽은 aligned 를 맞출수 있지만 다른쪽은 항상 unaligned 처리를 해야 한다는거야.
그러면 어쩔수 없지, src 에서 2번 읽은걸 dst 에 조합해서 넣어줘야함.
이때 bit shift, bit-wise or, bit-wise and 등을 써줘야 하지.
귀찮게 막~~~ 그걸 저 주소 조합별로 다 구현해야함.
최대한 단순화 시켜도 꽤 복잡해져. -> 그래서 컴파일러가 소스 작성 의도를 파악하기 힘들지.
굵은 글씨가 이해가 안됩니다..
엉엉 ㅠㅠ
3번 굵은 글씨는 오타입니다
그러면 어쩔수 없지, src 에서 2번 읽은걸 dst 에 조합해서 넣어줘야함. 이때 bit shift, bit-wise or, bit-wise and 등을 써줘야 하지. 이부분을 모르겠습니다
2번에서 정렬상태로 복사한다는건 원래의 목표 크기를 다시 4바이트 단위로 맞춰야 한다는거죠?
( size - 3 ) / 4 * 4 가 실제 4바이트 단위로 전송할 크기가 됩니다.
즉 ( size - 3 ) % 4 가 남겨지게 되죠.
그건 다시 1바이트로 전송해야 된다는 이야기. 아까 주소로 보여준거랑 같은 이야기쥬
자, 2번에서 src 측을 4바이트 주소로 맞췄을 때, dst 측은 2 바이트 지나가 있는 위치에 떨어지게 되죠?
그러지 않기 위해 dst 도 4바이트로 정렬을 하면, src 측을 8바이트 읽어 그 중간것( 2바이트 밀린 내용)을 복사해 넣어줘야 해요.
그 중간것을 얻어내기 위해 shift 와 and, or 등의 합성방법을 써야 한다는거죠.
그게 온전한 aligned 처리예요. ( src, dst 포인터 모두를 aligned 상태로 이동시키는 방법 )
memcpy( dst + 3, src + 1, size ); => memcpy( dst + 6, src + 4, size - 3 ); 이면 dst가 3바이트만큼 떨어진게 아닌가여?
dst + 4 + 2 만큼 떨어진다는거쥬.
dst + 4 는 정렬된 주소 기준이구.
그럼 2바이트 밀어줘야겠쥬?
아 그럼! dst의 밀린 바이트를 얻기 위해서는 -> dst 뒤에 8바이트를 더 읽고 -> 2바이트 만큼 shift해주고 -> dst에서 밀린 2바이트를 | 비트 연산으로 채운다는 말인가여?
아뇨 src 에서 8바이트 읽어서 가운데껄 취한 다음 정렬된 dst 에 넣어준다는거죠
그러니까 실제론, src 에서 4바이트 읽었던 이전꺼를 변수에 보관했다가,
새로 읽은 src 의 4바이트랑 쉬프트와 OR 로 합성해서 dst 에 넣는단 말씀.
아!! 감사합니다!!