IT이야기

C에서 인트 크기의 "적어도"를 어떻게 요청해야 하는가?

cyworld 2022. 5. 19. 22:41
반응형

C에서 인트 크기의 "적어도"를 어떻게 요청해야 하는가?

상황:

나는 자원 집약적이고 휴대할 수 있도록 설계된 C로 작성된 애플리케이션을 가지고 있다.컴파일러가 최소 32비트를 사용하는 경우 아키텍처에서 가장 빠른 int 크기를 선택할 수 있도록 허용하고 싶다.

적어도 "32비트"의 크기를 선택할 수 있는가, 아니면 컴파일러가 이러한 종류의 것들을 자동으로 최적화할 것인가?

표준 헤더stdint.h종류를 제공하다int_leastN_t그리고uint_leastN_t어디에N8, 16, 32 및 64(그리고 다른 것들도 가능하지만 이러한 것들은 필요하지 않다).이것들은 C99의 표준이다.

그것은 또한 "빠른" 대안들, 소위 "빠른" 대안들을 제공한다.int_fastN_t그리고uint_fastN_t, 동일한 값을 가진N.

그래서, 당신의 경우, 당신은int_least32_t또는int_fast32_t.

다른 사람들이 지적했듯이, 표준 포함 파일은int_fast32_t,int_least32_t,uint_fast32_t,uint_least32_t그것은 당신이 원하는 대로 행동해야 하지만, 그러한 타입은 극도의 주의를 기울여 사용되어야 한다.정수 프로모션 규칙 때문에 C 코드는 유형을 사용하지 않을 수 없다.int그리고unsigned int또한 정수 리터럴이 항상 기대되는 타입은 아닐 수 있다.a의 비교int_fast32_T그리고 문맹.0xABCD1234또는12345u예를 들어, 서명 또는 서명되지 않은 상태로 수행될 수 있다.int16, 32, 64비트.마찬가지로, 만약n32비트 이상, 의 의미n &= ~0x8000;16비트 컴퓨터에서는 큰 컴퓨터와는 다를 것이다.

C 표준은 특별히 정수 크기를 고려하는 쓰기 코드를 용이하게 설계하지는 않았지만, 그럼에도 불구하고 크기가 다른 하드웨어에서는 호환이 가능하다.종류:int_fast32_t휴대할 수 있어야 할 것 같은 코드를 쉽게 쓸 수 있게 하지만 언어에 숨겨져 있는 모든 고약한 작은 함정에 대해 안일함을 조장할 수 있다.

이 질문도 C++로 태그가 붙었으니까 나처럼 메타프로그래밍을 좋아하는 사람들을 위한 해결책이 여기 있다.

요구 사항들

  • 형식 목록 유형(이름)list여기에
  • 하스켈 같은filter불효의
  • A head타이프리스트의 첫 번째 요소를 얻는 데 실패함

코드

이 솔루션은 수용된 솔루션("가장 적합한 솔루션으로 이동하여 선택")을 자동화한다.그 일은 컴파일러가 할 수 있겠지?

먼저 다음에서 선언된 모든 플랫폼별 가장 빠른 정수 유형을 나열하십시오.<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;

가장 빠른 =>는 실용마 팩을 사용한 아키텍처에 맞추어 정렬한다.이것이 없다면, 메모리가 정렬되지 않은 경우, 두 개 이상의 메모리 액세스가 필요할 것이다.

min 32 => 지정자를 사용 - 충분하다.이것은 내가 아는 바로는 모든 아키텍처에 걸쳐 32비트의 Linux를 보장한다.

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

반응형