C에서 "적어도"int 크기를 어떻게 요청합니까?
그 상황:
리소스 집약적이고 이식 가능하도록 설계된 C로 작성된 응용 프로그램이 있습니다. 컴파일러가 아키텍처에 대해 가장 빠른 int 크기를 선택할 수 있도록 허용하고 싶습니다. 단, 32 비트 이상이어야합니다.
"최소한"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
. 또한 정수 리터럴은 항상 예상되는 유형이 아닐 수 있습니다. 간의 비교 int_fast32_T
및 리터럴 0xABCD1234
또는 12345u
예를 들어 여부에 따라, 서명 또는 서명 중 하나로 수행 될 수 int
16, 32, 또는 64 비트. 마찬가지로, n
32 비트 이상인 경우 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
'Program Tip' 카테고리의 다른 글
SQL Server FOR EACH 루프 (0) | 2020.12.15 |
---|---|
MySQL 오류 1264 : 열의 범위 값을 벗어남 (0) | 2020.12.15 |
Python / psycopg2 WHERE IN 문 (0) | 2020.12.15 |
AWS Lambda에서 Socket.io를 사용할 수 있습니까? (0) | 2020.12.15 |
Webpack을 사용하여 프로젝트에서 여러 파일 항목 및 출력을 설정하는 방법은 무엇입니까? (0) | 2020.12.14 |