2017-02-09 5 views
2

malloc을 사용하면 어떻게 될까요? (또는 새로운 것입니다. 대부분의 구현에서 malloc으로 구현되고 malloc에 ​​대해 표준이 정렬에 대해 말하는 것과 가장 높은 스칼라 정렬) 정렬 요구 사항이 시스템의 최대 정렬 요구 사항보다 높게 설정된 유형 (alignof(std::max_align_t))? 그래서 뭔가 같은메모리 정렬이 최대 정렬보다 높습니다. alignas malloc

alignas(alignof(std::max_align_t) + alignof(int)) struct Something { 
    ... 
}; 
+0

하자'필요한 정렬을 나타내는 n'을 다음과 같이

그런 다음 당신은 안전하게 구조를 할당 할 수 있습니다 . 'malloc'을'n + sizeof (struct Something)'로 호출 한 다음'malloc'에 의해 반환 된 값에서 시작하여 정렬 된 주소를 찾으십시오. '[retVal, retVal + n-1]'사이에 유효한 주소를 찾을 수 있습니다. 그런 다음이를 구조의 기본 주소로 사용하십시오. –

+0

@barakmanos 그건 영리한 해킹 롤, 거기에 도서관 솔루션이 무엇입니까? C가 최대 스칼라 요구 사항보다 높은 정렬 요구 사항이 없었기 때문에 걱정할 필요가 없다고 생각합니다. – Curious

+0

모든 공급 업체는 지원되는 플랫폼 (컴파일러 + 기본 HW 아키텍처)에 적합한 malloc을 제공해야한다고 생각합니다. –

답변

0

답변에 대한 설명.

ALIGNMENT은 필수 정렬을 나타냅니다. (그것은 더 쉽게 답을 만들었을 것입니다 당신이 언급하지 않은 나쁘지 질문에 있음)

char* buffer = new char[ALIGNMENT+sizeof(Something)]; 
uintptr_t address = reinterpret_cast<uintptr_t>(buffer); 
uintptr_t aligned_address = address+ALIGNMENT-address%ALIGNMENT; 
Something* something = reinterpret_cast<Something*>(aligned_address);