2014-09-18 3 views
3

최근에 일부 Vector/Matrix 클래스를 SSE를 사용하는 클래스로 대체했으며 이제 메모리가 올바르게 정렬되었는지 확인하고 있습니다.대체 연산자가 새로 추가 된 클래스에 대한 사용자 정의 std :: allocator

this question에 대한 대답에 대한 조언에 따라 필자는 new/delete 연산자를 필요로하는 클래스로 바꾸고 STL 컨테이너와 함께 사용할 사용자 지정 할당 자에 대한 작업을 시작했습니다. 그러나 사이에 약간의 충돌이있는 것으로 보입니다 두 가지 :

시작하려면 먼저 샘플 할당 자 클래스를 복사하여 here에서 붙여 넣었습니다. 예제 할당 자 클래스는 사용자 정의 새/삭제없이 해당 유형의 std :: vector와 함께 사용할 때 잘 컴파일됩니다. 하지만 그 함수를 대체 할 때 "constructor() 함수에서 'operator new'에 대한 호출과 일치하는 함수가 없습니다.

"평소"새로운 것을 대체했는지 모릅니다. 어떻게 든 새 게재 위치를 모호하게 만들었습니까? 그러나, 새로운 픽업을 쓸 수 없다는 점을 감안할 때, 나는 정말로 무엇을 해야할지 잘 모르겠다 ... 나는 전체 커스텀 메모리 할당에 대해 새롭다. 많이 감사하겠습니다!

저는 리눅스에서 Clang v3.4 (또는 gcc 4.1.2)를 사용하여 컴파일 중입니다. C++ 11을 사용하지 않습니다.

감사합니다. 이 발견 T의 클래스 범위와 ::를 생략함으로써

답변

4

정식 allocator::construct 전화

::new((void *)p) T(val), 당신은 수 있도록 한 이름 검색 시작 클래스 범위의 operator new과에 더 (name lookup 중지를 진행하지 않았다

(공백으로 캐스트하는 것은 사용자가 전역에 거의 배치 된 새 오버로드로 몰래 들어가는 경우에 해당합니다. void 포인터 매개 변수)

추 신 : 정확하게 "내 자신의 배치를 새로 작성할 수 없다는 점을 감안하면"잘못된 가정이라고 지적합니다. 전역 배치 (new)를 대체 할 수는 없지만 새로운 클래스 별 배치를 작성할 수 있습니다. 그런 다음 클래스 범위 조회에 의해 선택됩니다. 할당 기능에 대한 요약은 cppreference을 확인하십시오.

+0

이 문제를 해결하기 위해':: new' ** 또는 ** 클래스에 대한 오버라이드 된 배치'new'를 구현합니다. – Yakk

+0

아, 네, 이해가됩니다 ... 고마워요! 어떤 이유인지 나는 이것을 지적한 ccpreference에 대한 주석을 완전히 놓쳤습니다. "배치 새로운 (오버로드 5 및 6)은 대체 될 수 없지만 위에서도 설명한 것처럼 동일한 범위의 서명으로 함수를 정의 할 수 있습니다." 죄송합니다. – YamLady

1

내가 부스트의 aligned_allocator 사용하는 것이 좋습니다 것 :

#include <boost/align/aligned_allocator.hpp> 
#include <immintrin.h> 
#include <vector> 

struct m128i { 
    // FIXME: ctors/opers with intrinsics would be nice (required?) 
    __m128i data; 
} 

int main() 
{ 
    std::vector<m128i, boost::alignment::aligned_allocator<m128i, 16> > v; 
    v.emplace_back(); 
} 

참고 : 나는 고유 멤버를 감싸는 구조를 사용하려면이 업데이트되었습니다. 이를 수행하는 라이브러리가 많이 있습니다. 이렇게하는 이유는 간단합니다. vector_size 속성은 __m126i와 __m256i를 __m512i와 구별하며 템플릿에서 유형 속성을 무시하므로 "long long"(또는 float/double)과 같은 확장을 사용하게됩니다. 비 -i 및 -d 유형의 경우).

0

여기서 주어진 할당 자로 시작 지점을 사용합니다 : http://en.cppreference.com/w/cpp/concept/Allocator. 실제로는 최소한의 할당 자입니다. 특히, construct을 쓰지 않아도됩니다. allocator_traits, 할당자가 construct 메서드를 찾지 못하면 :: (Cubbi 메모)으로 올바르게 범위 지정을하여 새로 배치를 호출하므로이 문제가 발생하지 않습니다 : http://en.cppreference.com/w/cpp/memory/allocator_traits/construct.

사용자 정의 새/삭제를 작성하지 않았을 수 있습니다. 사용자 정의 할당자를 작성하고 Vector/Matrix 클래스가 사용자 정의 할당자를 사용하여 std::vector을 통해 데이터를 관리하게하면 충분합니다.