C에서 인트 크기의 "적어도"를 어떻게 요청해야 하는가?
상황:
나는 자원 집약적이고 휴대할 수 있도록 설계된 C로 작성된 애플리케이션을 가지고 있다.컴파일러가 최소 32비트를 사용하는 경우 아키텍처에서 가장 빠른 int 크기를 선택할 수 있도록 허용하고 싶다.
적어도 "32비트"의 크기를 선택할 수 있는가, 아니면 컴파일러가 이러한 종류의 것들을 자동으로 최적화할 것인가?
표준 헤더stdint.h
종류를 제공하다int_leastN_t
그리고uint_leastN_t
어디에N
8, 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
예를 들어, 서명 또는 서명되지 않은 상태로 수행될 수 있다.int
16, 32, 64비트.마찬가지로, 만약n
32비트 이상, 의 의미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
'IT이야기' 카테고리의 다른 글
Vue.js 단일 파일 구성 요소의 데이터 가져오기 (0) | 2022.05.19 |
---|---|
Vue의 공리에 페이지 지정 매개 변수 추가 (0) | 2022.05.19 |
Vue 2 제공 / 주입 API를 반응적으로 만드는 방법 (0) | 2022.05.19 |
size_t의 최대값을 찾기 위한 휴대용 방법은 무엇인가? (0) | 2022.05.19 |
상태가 업데이트되면 데이터가 변경되는 이유는? (0) | 2022.05.19 |