현재 할당 자의 개념을 기반으로하는 C++ 용 메모리 관리 라이브러리를 작성하고 있습니다. 그것은 지금, 모든 할당 자이 두 멤버 함수 구현, 비교적 간단합니다할당 자 라이브러리에서 할당 오버 헤드 당 더 작음
virtual void * alloc(std::size_t size) = 0;
virtual void dealloc(void * ptr) = 0;
당신이 볼 수 있듯이, 내가 인터페이스에 정렬을 지원하지 않습니다을하지만 실제로 내 다음 단계 : 그리고 난 왜 이유 이 질문을합니다.
각 할당자가 전문화 될 수 있기 때문에 할당 자에게 정렬 책임이 있습니다. 예를 들어 블록 할당자는 블록 크기의 정렬 된 메모리 만 반환 할 수 있으므로 실패를 처리하고 다른 정렬을 요청하면 NULL을 반환 할 수 있습니다.
내 할당 자 중 일부는 실제로 하위 할당 자입니다. 예를 들어, 그 중 하나는 할당에 대한 포인터 충돌 만하는 선형/순차 할당 기입니다. 이 할당자는 char * pBegin과 char * pEnd를 전달하여 생성되며 메모리의 해당 영역에서 할당합니다. 지금은 위대한 작품이지만 1 바이트 정렬되는 물건을 얻을. 그것은 x86에서 작동하지만 다른 CPU (콘솔)에서 재앙이 될 수 있다고 들었습니다. 또한 x86에서의 읽기 및 쓰기 속도가 다소 느립니다.
정렬 된 메모리 관리를 구현하는 유일한 방법은 추가 sizeof (void *) + (alignement - 1) 바이트를 할당하고 원래 할당 된 주소를 유지하면서 정렬 된 주소를 반환하는 포인터 비트 마스크를 수행하는 것입니다. 사용자 데이터 앞에있는 바이트 (void * 바이트, 위 참조).
OK, 내 질문은 ...
그 오버 헤드 할당 당, 나에게 큰 보인다. 4 바이트 정렬의 경우, 32 비트 CPU에는 7 바이트의 오버 헤드가 있고, 64 비트에는 7 바이트의 오버 헤드가 있습니다. 그것은 많은 것처럼 보인다.
우선 많이입니까? 과거에 사용했거나 현재 사용하고있는 다른 메모리 관리 라이브러리와 동등합니까? malloc을 살펴 봤는데 16 바이트 이상의 오버 헤드가있는 것 같습니다. 맞습니까?
내 lib의 사용자에게 정렬 된 메모리를 반환하는 더 좋은 방법, 작은 오버 헤드를 알고 계십니까?
패딩에 대해 아무 것도 할 수 없다고 생각합니다 ... 다음 할당을 위해 패딩 바이트 중 일부를 헤더로 사용하고 (책을 유지하는 경우) 8을 유지할 수 있습니다. - 바이트 정렬,하지만 그건 엄청 까다로운 소리. – Cornstalks
각 정렬에 대해 서로 다른 할당자를 사용하십시오. 그런 다음 패딩이 0입니다. 대부분의 할당자는 정렬되므로 두 배가 올바르게 정렬됩니다. double이 8 바이트이면 1, 2, 4 및 8 바이트 정렬을위한 할당자를 가져야합니다. –