구조체는 가장큰 멤버를 기준으로 나머지 변수가 패딩이 생기는데
그러는 이유가 한꺼번에 64bit, 32bit 씩 읽어올 수 있기 때문이라고했음
pragma pack(1) 이런걸로 구조체 패딩 없애도 어셈으로 보면 결국엔 rsp-0x18 이러면서 스택 위치에서 결국 오프셋으로 접근하는데
한번에 읽어오는거랑 먼상관임?
차라리 다른 글에서 본 캐시 히트율때문에 64byte로 맞추는 작업이 더 맞는거같은데 알려주세요
구조체는 가장큰 멤버를 기준으로 나머지 변수가 패딩이 생기는데
그러는 이유가 한꺼번에 64bit, 32bit 씩 읽어올 수 있기 때문이라고했음
pragma pack(1) 이런걸로 구조체 패딩 없애도 어셈으로 보면 결국엔 rsp-0x18 이러면서 스택 위치에서 결국 오프셋으로 접근하는데
한번에 읽어오는거랑 먼상관임?
차라리 다른 글에서 본 캐시 히트율때문에 64byte로 맞추는 작업이 더 맞는거같은데 알려주세요
그거는 c언어가 만들어질 unix시절에 임의로 만든 거임 ㅇㅅㅇ 효율과도 상관이 없음 몇몇 최초의 사람들이 임의로 정한 거라서 ㅇㅅㅇ
지금 시대에 사람들이 정한다면 엄청 논리적으로 정하겠지만 말이지 ㅇㅅㅇ
unix 호환 함수호출규약에 따른 어셈 내용 같은 것도 그당시 정해진 거임 몇몇 최초의 사람들에 의해서 ㅇㅅㅇ
모두 그당시 만들어진 함수호출규약을 따라 어셈이 정해져있고 모든 언어가 동적함수를 호출할 때마다 이를 따름 ㅇㅅㅇ
그래서 모든 커널은 c나 c와 호환되는 c++로만 작성되는 거임 ㅇㅅㅇ
c와 호환되는 rust로 하기도 하는데 코드에 일일이 다 정해줘야돼서 작성효율이 안 나와서 버려진 언어 ㅇㅅㅇ
posix도 관련이 있고 이런 내용 찾아보려면 옛날 시대에 어떤지 역사를 찾아봐야됨 ㅇㅅㅇ
영어 원서 책 잘 찾아보면 그런 거 언급한 책 있을지도 ㅇㅅㅇ
그니까 지금 속도적인 이득은 없고 옛날 컴파일러는 그렇게 동작햇을수 있지만 지금 컴파일과정에선 안쓴다 이거임? 근데 안쓴다 하기엔 아직도 컴파일 과정에 패딩이 포함될 이유가 없는데
일단 캐시히트율 때문에였다면 오히려 모든 패딩 비트를 없애지 않았겠냐
캐시히트율에 따라 어떤 비트가 가장 빠른지는 설계에 따라 다름 32bit CPU일 때와 64bit CPU일 때 가장 빠른 캐시히트는 아키텍처 마음임 ㅇㅅㅇ
더 심해졌네
여전히 32비트 int를 많이 사용하기 때문에 32나 64 중 어느 쪽을 기준으로 64비트 아키텍처에서 사용할지는 찾아봐야하고 아키텍처 만드는 회사 아니고는 문서를 찾을 수 없을지도 모름
그런 거 문서 찾아보고 싶은데 지네들 회사 내부에서만 공유하더라고 ㅇㅅㅇ
그 정도 지식은 보통 책에도 안 나와 pdf 내부 문서 같은 거 찾아봐야되는데 공개안하기도 해 ㅇㅅㅇ
아니면 직접 시간 찍어서 계산해보든가 ㅇㅅㅇ 그래도 작성된 코드 주변 어셈에 따라 속도가 다양하게 많이 바뀔 거임 현대 CPU는 분기를 기준으로 효율을 위해 분기를 미리 계산하도록 만들어져서 ㅇㅅㅇ
내가 궁금햇던건 무슨 "워드단위로 메모리를 읽어서 몇번에 나눠읽지 않게 하려고 구조체에 패딩을 넣는다" 라는게 어셈단에서는 오프셋으로 한번에 위치찾아 읽어오는데 의미가 있나가 궁금햇던거임
캐시히트율 이야기는 다른글에서 봣는데 구조체 정렬로는 사실 크게 효율이 없으니까 차라리 캐시 페이징이라하나 그거 단위로 64바이트씩해서 구조체를 맞춰두면 캐시히트율이 늘어나고 그게 더 최적화다 라는 내용이엿던거
나트륨은 여전히 레전드다
메모리 읽어올 때 4바이트 단위로 읽어서 그럼ㅇㅅㅇ 나트륨짱 << 이새끼말절반은 틀렸음ㅇㅅㅇ 찾으면 잘만 나오는 내용인데
캐시 히트랑 조또 상관없고… 예를 들어 구조체 아니더라도 char str[30] 이런 식으로 char array선언하면 32바이트 차지할거임 30바이트 차지하게 설계해도 2바이트 남은 부분을 쓸 수가 없으니까 그냥 4바이트씩 잘라서 접근하는거임
자세한거 운영체제의 메모리 가상화 부분 공부하면 이해할 수 있음ㅇㅅㅇ 내 기억에 C 메모리 주소 직접 접근하려고 메모리 찍어서 접근해도 1바이트 단위로 접근하면 에러터지는걸로 아는데 ㅇㅅㅇ 어떻게 형변환하면 안되는건 아니지만?? 그럴정도로 메모리의 최소 관리 단위(좋은 표현은 아니지만… 이해를 위해서)가 4바이트라는거임
64비트운영체제는 8바이트일꺼고ㅇㅅㅇ
왜 나트륨짱이 캐쉬히트 소리를 했는지 생각해봤는데 구조체를 패딩없이 쭉 쳐박으면 중간에 있는 멤버변수가 0x103~0x106까지 이런 식으로 걸쳐져있다 이런걸 상정해서 얘기한거 같은데 그런 얘기를 할거면 그냥 바로 메모리 가상화를 얘기하면 되는데 CPU분기니 내부문서니 ㅇㅅㅇ
저런 식으로 패딩없이 짜서 메모리 사이에 걸쳐있게 되면 걸쳐있는 구조체의 멤버변수에 접근하려고 하면 캐시히트가 아니더라도 상식적으로 메모리를 4바이트만 읽으면 되는걸 8바이트를 읽어야 되는걸 알 수 있음ㅇㅅㅇ 포인트 증감연산도 해야할수도 있고ㅇㅅㅇ
나도 추상적으로 대답한거라 정확한 사실관계, 실제로 C컴파일러가 패딩을 어떻게 넣는지나 운영체제가 실제로 메모리를 어떻게 매핑하는지에 대해서 틀린 부분이 있을 수 있긴 한데 "패딩을 왜 하는지", "메모리 관리를 어떻게 하는지"에 대해선 얼추 맞을꺼임ㅇㅅㅇ