2014-12-17 3 views
8

클래스 멤버 인 포인터에 alignas을 사용하려하고 솔직하게 말해서 어디에 넣어야하는지 잘 모르겠습니다. 예컨대alignas 구문으로 고민

: I가 PTR가 64 바이트 정렬 된 블록의 데이터를 보장하기를 희망

class A 
{ 
private: 
    int n; 
    alignas(64) double* ptr;  

public: 
    A(const int num) : n(num), ptr(new double[num]) 
    {} 
}; 

. 인텔 컴파일러를 사용하면 그렇지 않습니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

+5

[저를 위해 일하는 것 같습니다] (http://rextester.com/LCVUW98273) ('A'의 크기가 지나치게 큽니다). 아니면 데이터'ptr'가 **에 **를 가리키고있는 것이 ** over-aligned이 되길 바랬습니까? 그것은 인과 관계의 위반을 요구할 것입니다. –

+0

컴파일러가 64의 정렬을 지원하지 않을 수 있습니까? – Brian

+0

감사의 뜻 과실, 그것은 나의 오해의 근원을 보여주고 있습니다. 포인터가 가리키는 데이터가 아니라 포인터가 정렬됩니다. 데이터 블록이 정렬되기를 기대하고있었습니다. – user1683586

답변

5

클래스 구성원에 alignas(N) 키워드를 사용하면이 구성원은 잠재적으로 지정된 엔터티가 아닌 지정된 정렬에 따라 정렬됩니다. 결국 값으로 포인터를 초기화 할 때 이미 존재하는 객체를 정렬하는 컨트롤이 없다.

당신은 반환 된 포인터의 정렬을 위해

  1. 스펙 소요 std::align() 좀보고 할 수 있습니다.
  2. 정렬 된 블록의 크기.
  3. 할당 된 메모리에 대한 포인터입니다.
  4. 할당 된 메모리 양입니다.

정렬 및 크기 요구 사항을 모두 만족시킬만큼 공간이 충분하지 않으면 대응하는 포인터를 반환합니다. 공간이 충분하지 않으면 함수는 널 포인터를 리턴합니다.

+0

'ptr = x;'를'ptr = decltype (ptr) (x와 ~ uintptr_t (64-1));로 대체하면 ptr이 64 바이트 경계에 정렬되도록 보장 할 수 있습니다. 좋은 방법은 아닙니다. – Yakk

+0

@Yakk :'std :: align()'을 사용하는 것이 바람직하다고 생각합니다. 구현이 폰터를 적절히 맞추기 위해 수행하는 작업은 전적으로 구현에 달려 있습니다. 귀하의 접근 방식은 포인터의 앞쪽에있는 메모리를 방해 할 가능성이 있기 때문에 먼저 포인터를 적당한 양만큼 오프셋시키고 싶을 것입니다. –

+0

내 "솔루션"의 실제 문제는 내가 나가서 포인터를 아무 것도 쓸모 없게 수정했다는 것입니다. 포인터가 정렬되었지만 유용한 점을 가리 키지는 않습니다. – Yakk