Program Tip

C에서 "적어도"int 크기를 어떻게 요청합니까?

programtip 2020. 12. 15. 19:43
반응형

C에서 "적어도"int 크기를 어떻게 요청합니까?


그 상황:

리소스 집약적이고 이식 가능하도록 설계된 C로 작성된 응용 프로그램이 있습니다. 컴파일러가 아키텍처에 대해 가장 빠른 int 크기를 선택할 수 있도록 허용하고 싶습니다. 단, 32 비트 이상이어야합니다.

"최소한"32 비트의 크기를 선택할 수 있습니까? 아니면 컴파일러가 이러한 종류의 것을 자동으로 최적화합니까?


표준 헤더 stdint.hint_leastN_t유형을 제공합니다 uint_leastN_t. 여기서는 N8, 16, 32 및 64 (및 기타 가능하지만 필수는 아님)입니다. 이들은 C99의 표준입니다.

또한 동일한 값을 가진 "빠른"대안 (일명 int_fastN_tuint_fastN_t)을 제공합니다 N.

따라서 귀하의 경우 int_least32_t또는 int_fast32_t.


다른 사람이 언급했듯이, 표준 파일 정의 포함 int_fast32_t, int_least32_t, uint_fast32_t, uint_least32_t가능성이 당신이 원하는대로 행동하지만, 같은 종류의 매우 조심해서 사용해야 할 필요가되어야한다. 정수 승격 규칙으로 인해 C 코드가 유형 intunsigned int. 또한 정수 리터럴은 항상 예상되는 유형이 아닐 수 있습니다. 간의 비교 int_fast32_T및 리터럴 0xABCD1234또는 12345u예를 들어 여부에 따라, 서명 또는 서명 중 하나로 수행 될 수 int16, 32, 또는 64 비트. 마찬가지로, n32 비트 이상인 경우 n &= ~0x8000;16 비트 시스템 에서는의 의미가 더 큰 시스템에서는 다릅니다.

C 표준은 정수 크기를 고려하는 코드 작성을 용이하게하기 위해 특별히 설계된 적이 없지만 그럼에도 불구하고 크기가 다른 하드웨어에서 호환 가능하게 작동합니다. 이와 같은 유형은 int_fast32_t이식 가능해야하는 것처럼 보이는 코드를 쉽게 작성할 수 있도록하지만 언어에 숨겨진 모든 사악한 함정에 대해 안일함을 조장 할 수 있습니다.


이 질문도 C ++로 태그가 지정되었으므로 여기에 저와 같은 템플릿 메타 프로그래밍 애호가를위한 솔루션이 있습니다.

요구 사항

  • list여기 에 명명 된 유형 목록 유형 입니다.
  • Haskell과 유사한 filter메타 함수.
  • 유형 목록 head의 첫 번째 요소를 가져 오는 메타 함수입니다.

코드

이 솔루션은 허용되는 솔루션을 자동화합니다 ( " stdint.h가장 적합한 솔루션 찾아 선택" ). 그 일은 컴파일러가 할 수 있지 않습니까?

먼저 다음에서 선언 된 모든 플랫폼 별 가장 빠른 정수 유형을 나열합니다 <cstdint>.

using integer_types = list<std::int_fast8_t,std::int_fast16_t,
                           std::int_fast32_t,std::int_fast64_t>;

목록은 정수 크기를 늘려 정렬됩니다.
이제 필터링 술어를 정의하십시오. 우리의 경우 크기는 사용자가 지정한 크기보다 작아야합니다 (이름 지정 SIZE).

template<typename T>
using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= SIZE>;

그런 다음 정수 유형 목록을 필터링하고 결과의 첫 번째 요소를 가져옵니다.

using best_integer_t = head<filter<f,integer_types>>;

요약 된 솔루션

template<std::size_t SIZE>
struct fastest_integer_impl
{
    //Guard for the case the user specified less than one byte size:
    static constexpr const std::size_t size = SIZE >= CHAR_BITS ? size : CHAR_BITS;

    using integer_types = list<std::int_fast8_t,std::int_fast16_t,
                               std::int_fast32_t,std::int_fast64_t>;

    template<typename T>
    using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= size>;

    using type = head<filter<f,integer_types>>;
};

template<std::size_t SIZE>
using fastest_integer = typename fastest_integer_impl<SIZE>::type;

가장 빠른 => pragma 팩을 사용하여 아키텍처에 맞 춥니 다. 이것이 없으면 메모리가 정렬되지 않은 경우 하나 이상의 메모리 액세스가 필요합니다.

min 32 => use int specifier - enough. This ensures 32 bits in linux across all architectures to my knowledge.

ReferenceURL : https://stackoverflow.com/questions/24866303/how-do-i-ask-for-at-least-a-size-of-an-int-in-c

반응형