벡터에 기본타입인 정수를 담으면 이건 메모리 로컬리티가 보장되잖아? (맞지..?)
예를 들어서 vec![1, 2, 3, ...] 인 경우 모두 스택 영역에 있으므로 메모리 로컬리티가 있고 그러므로 캐시히트율도 높으니까 성능이 높은데
vec![some_struct, ...] 이렇게 구조체가 있는 경우는 구조체는 다 힙 영역에 있잖아?
그럼 이건 배열을 돌아도 캐시히트가 잘 안되는건가??
벡터에 기본타입인 정수를 담으면 이건 메모리 로컬리티가 보장되잖아? (맞지..?)
예를 들어서 vec![1, 2, 3, ...] 인 경우 모두 스택 영역에 있으므로 메모리 로컬리티가 있고 그러므로 캐시히트율도 높으니까 성능이 높은데
vec![some_struct, ...] 이렇게 구조체가 있는 경우는 구조체는 다 힙 영역에 있잖아?
그럼 이건 배열을 돌아도 캐시히트가 잘 안되는건가??
무슨언어임?
vec! 이건 러스트긴한데 언어랑은 상관없는 질문인거같긴한데..
아 그냥 궁금해서 물어본거임. !쓰길래
러스트 잘모르는데 정적배열 안에 구조체가 든 형태면 스택에 저장될텐데 그리고 배열이면 스택이든 힙이든 상관없이 순차적으로 저장되있어서 어느정도 memory locality 보장될껄
그러니까 난 러스트는 잘모르는데 C++에서 배열을 정적으로 쓰든 동적으로 쓰든 int형을 담든 사용자 자료형을 담든 큰 차이는 없을 것같은데… 여기 나보다 고수들 많아서 더 잘 설명해줄듯ㅇㅅㅇ
러슬람 러들러들~
프로그램 실행해서 캐시미스 횟수 직접 측정하는것 말고는 다른방법이 없음
구조체마다 다름
구조체 캐시미스 줄일려면 AoS를 SoA 방식으로 사용하는것도 고려해볼수 있음
구조체가 문제가 아니라 벡터가 잡는 메모리에 직접 들어가는지랑 레퍼런스(포인터)로 들어가는지가 다른건데 - dc App
예를들어서 구조체에 name이라는 필드가 있다고 가정했을 때 벡터 전체를 돌면서 모든 name을 출력하는거면 결국 구조체에 직접 접근해야하니까 퍼포먼스 구린거 맞음? 아님 이 경우에도 레퍼런스로 들어갈 수도 있나??
구조체가 레퍼런스로 있는 경우랑 충분히 작고 vector메모리 영역에 직접 들어가는 경우랑 다른거 - dc App
c++면 포인터로 구조체 넣는거랑 구조체 자체를 넣는차이임 - dc App
레퍼런스로 있으면 역참조를 매번해야하는데 구조체가 직접 있으면 역참조가 없으니까 순차적으로 name에 접근할 때 구조체 크기 만큼 점프하면서 읽는데 보통 페이지보다 작은 단위로 뛸태니까 역참조 안하는거 이상으로 이득이 있는더 - dc App
레퍼런스 역참조하면 주소가 한곳에 몰려있다는 보장이 없으니까 거기서 님이 말한 로컬리티가 없어짐 - dc App
직접 들어가고 순차적으로 돌때 최적이고 여기저기 떨어진곳 역참조 여러번 해야하면 님이 생각하는것처럼 구림 - dc App