2014-01-06 9 views
2

뭔가를 간과하지 않으면 uintmax_t를 선택하면 정수가 처리됩니다.정렬을 위해 가장 제한적인 데이터 유형을 이동 가능하게 결정

(1) float에 대한 유사한 데이터 유형이 있습니까? 그렇다면 어떤 헤더에 있습니까? (float.h에 나와 있지 않다.)

(2)이 2 가지 데이터 유형 (우리가 (1)을 긍정으로 대답 할 수 있다고 가정 할 때)의 결합을 선택하는 것이 항상 가장 제한적이어야한다는 것이 맞습니까?

+0

"이동 가능한 것으로 결정"에서 _given_ 플랫폼에서 가장 제한적인 정렬을 찾는 것이 더 큰 문제를 해결하지 못할 수도 있습니다. 아마도 "가장 제한적인 데이터 유형"을 사용하는 코드의 예가 도움이 될까요? – chux

+0

@chux : malloc을 다시 만드는 책에서 예전의 K & R 최종 예를 생각해보십시오. 그가 사용하는 연결된 목록의 머리글은 임의로 선택한 경우 (자신의 경우) "가장 제한적인 정렬 (긴)"으로 정렬됩니다. 현재 Kerrisk TLIP을 읽고 있는데, 연습은 malloc을 다시 구현하는 것입니다. 가능한 한 이식성을 높이고 목록을 정렬 할 수있는 기회를 원했습니다. – gnometorule

+1

감사합니다. §7.22.3에 따라'OP_malloc()'과 정렬을 잘하는 것이 좋습니다. 1 ** 메모리 관리 함수 ** ""... 적절한 정렬을 통해 모든 유형의 객체에 대한 포인터에 할당 될 수 있습니다. 기본 정렬 요구 사항 ... ". – chux

답변

4

에릭의 대답에서 지적한대로 C11은 가장 근본적인 정렬이 <stddef.h> : max_align_t 인 개체 유형을 정의합니다.

그러나 GCC에서 예상대로 작동하지 않을 수 있습니다. GCC의 웹 사이트에서 촬영 : 2011 :

C11로 알려진 C 표준의 네 번째 버전은 ISO/IEC으로 2011 년에 9899을 발표했다. GCC는이 표준을 에 대해 실질적으로 완벽하게 지원합니다. -std = c11 또는 -std = iso9899 : 2011을 사용합니다. ( 개발하는 동안,이 표준 버전의 초안이 C1X로 언급되었다.)

는 C11에 의존하지 않으려면 인해 신선도 및 지원의 현재 부족, 나는 조합과 정의 제안 모든 정수 유형, 모든 부동 소수점 유형, void 포인터 및 함수 포인터 : 이들 중 하나는 가장 제한적인 유형이어야합니다.

+0

다른 포인터 유형은 대부분의 C 구현에서 같지만 동일한 정렬 요구 사항을 요구하지 않습니다. –

+0

gcc가 4.6.3이고 -std = c11이 인식되지 않습니다. float에 대해 (u) intmax_t와 같은 것을 지적한 사람이 없다면 제안 된 해결책이 최선의 방법이라고 생각합니다. – gnometorule

+0

@EricPostpischil 사실, OP의 목적을 위해, 작동합니다 : 어떤 데이터 포인터도'char *'(역사적인 이유로) 또는'void *'로 변환되어 안전하게 반환 될 수 있기 때문에,이 포인터 타입은 가장 엄격한 정렬 요구 사항을 갖습니다 –

2

구현에서 지원되는 가장 큰 기본 정렬을 가진 객체 유형은 이고, 정의는 <stddef.h>입니다.

표준에서 정렬의 정렬 요구 사항이 구성원의 가장 엄격한 정렬 요구 사항임을 나타내는 텍스트가 표시되지 않습니다. 따라서 이론 상 노동 조합은 구성원 중 필요한 것보다 더 엄격한 조정을 요구할 수 있습니다. 나는 이것에 대한 거의 이유가 없으며 C 구현이 그것을 할 것이라고 기대하지 않는다. 일반적인 경우는 프로그램이 명시 적으로 더 큰 정렬을 요청하지 않는 한 (예 : _Alignas 키워드와 같이) 조합의 정렬 요구 사항이 해당 멤버의 가장 엄격한 요구 사항이라는 것입니다.

+0

'max_align_t'는 C11에서옵니다. – Palec

+0

그것은 완벽 할 것입니다; 하지만 stddef.h를 포함 시키면 장난감 프로그램에서 그러한 변수를 선언하고이를 인쇄하려고합니다. gcc는 알 수없는 유형 이름 오류를보고합니다. 아이디어? – gnometorule

+0

@Palec : C가 C 2011으로 변경되었습니다. 2011 표준은 "두 번째 버전 인 ISO/IEC 9899 : 1999를 취소하고 대신합니다". 누군가가 이전 버전의 C에 대해 물어보고 싶다면 명시 적으로 언급해야합니다. –

관련 문제