programing

스틴트를 사용해야 하는 이유(또는 사용하지 않는 이유)

prostudy 2022. 5. 11. 22:03
반응형

스틴트를 사용해야 하는 이유(또는 사용하지 않는 이유)

나는 이미 그것을 알고 있다.stdint플랫폼 간 이동성을 위해 특정 가변 크기가 필요할 때 사용한다.지금으로서는 그런 문제가 별로 없지만, 이미 위에서 보여진 사실 외에 그것을 사용하는 데 있어서 어떤 단점과 장점들이 있을까?

스택오버플로우 및 기타 사이트에서 이 링크를 찾으면서 테마 관련 링크 2개를 찾았다.

두 가지 링크는 특히 이 헤더의 주요 이유인 휴대성에 대해 더 많이 알고자 한다면 아주 좋다.하지만 나에게 있어서 내가 가장 좋아하는 것은 내가 생각하는 것이다.uint8_t보다 깨끗하다unsigned char: 값 (1998: RBG 채널 값장 장장 장장)int32_t단순한 것 보다 더 의미 있어 보인다.int

그래서, 제 질문은, 정확히 무엇이 사용의 단점과 장점인가 입니다.stdint휴대성 말고도?코드의 일부 특정 부분에만 사용해야 할까, 아니면 어디에서나 사용해야 할까? 만약 어디에든 있다면, 어떻게 하면 다음과 같은 기능을 사용할 수 있을까?atoi()strtok()

고마워!

프로스

잘 정의된 유형을 사용하면 코드를 포팅하기가 훨씬 쉽고 안전하게 만들 수 있으며, 예를 들어 한 기계에서 해석할 때 놀라운 결과를 얻을 수 없기 때문이다.int16비트, 32비트.은 stdint를 h로 타이핑을 하면 얻는 것이 된다.

사용.int위험한 유형의 프로모션도 탐지하기 어렵다.

또 다른 장점은 사용함으로써int8_t대신에char항상 8비트 변수의 서명을 받는다는 것을 알고 있을 것이다.char서명되거나 서명되지 않을 수 있으며, 구현 정의 동작이며 컴파일러마다 다르다.따라서 기본값은char휴대할 수 있어야 하는 코드에 사용하기에는 매우 위험하다.

변수를 최적화해야 한다는 힌트를 컴파일러에 제공하려면uint_fastx_t컴파일러에게 가능한 한 가장 빠른 정수 타입을 사용하라고 지시한다. 적어도 'x'만큼 큰 정수 타입을 사용한다.대부분의 경우 이것은 중요하지 않다. 컴파일러는 당신이 무엇을 입력했든 유형 크기에 맞게 최적화할 수 있을 만큼 충분히 똑똑하다.시퀀스 포인트 간에 컴파일러는 결과에 영향을 미치지 않는 한 유형을 지정된 것보다 다른 것으로 암시적으로 변경할 수 있다.

단점

없음


참조: MISRA-C:2004 규칙 6.3. 기본 형식 대신 크기 및 부호를 나타내는 형식 정의가 사용되어야 한다.

EDIT : 잘못된 예제를 제거함.

유일하게 사용해야 하는 이유uint8_t보다는unsigned char(미적 선호에 따라 다름) 프로그램에서 요구하는 사항을 문서화하려는 경우char정확히 8비트. uint8_tif와 if만 존재한다.CHAR_BIT==8, C 표준의 요구 조건에 따라.

나머지 사람들은intX_t그리고uintX_t유형은 다음과 같은 경우에 유용하다.

  • 디스크/네트워크 읽기/쓰기(하지만 Endian 변환 기능도 사용해야 함)
  • 정확한 컷오프에서 서명되지 않은 래핑 동작을 원할 때(그러나 이 동작은 보다 포텐셜하게 수행될 수 있음)&운영자(operator.
  • 패딩이 없는지 확인해야 하기 때문에 구조물의 정확한 레이아웃을 제어하는 경우(예:memcmp또는 해싱 목적.

더.uint_least8_t등유형은 낭비적으로 크거나 느린 유형을 사용하지 않으려는 모든 곳에서 유용하지만, 특정 크기의 값을 저장할 수 있는지 확인해야 한다.예를 들어, whilelong long적어도 64비트는 어떤 기계에서는 128비트일 수 있고, 필요한 것이 단지 64비트 숫자를 저장할 수 있는 유형일 때 사용하는 것은 그러한 기계에서는 매우 낭비적인 일일 것이다.int_least64_t문제를 해결한다.

는 의 사용을 보호할 수 있는 이다.[u]int_fastX_t특정 기기에서 ABI를 위반하는 경우가 있고 정의가 대개 잘못되었기 때문에 완전히 다른 유형.예를 들어 x86_64에서 64비트 정수형은 16비트, 32비트, 64비트 값에 대해 "빠른" 정수형으로 간주되지만, 32비트 값을 사용하든 64비트 값을 사용하든 추가, 빼기, 곱하기 등은 정확히 동일한 속도인 반면, 필요 이상의 유형으로 분할은 거의 확실히 느리고, 같은 속도였더라도 사용하고 있다.기억력의 두 배나 되는 거지

마지막으로, 일부 답변이 사용의 비효율성에 대해 제기한 주장에 주목하십시오.int32_t기본 정수 크기가 아닌 카운터의 경우 기술적으로 대부분 정확하지만, 올바른 코드와는 무관하다.최대 카운트가 통제되는 몇 가지 사항이나 카운트가 천문학적일 수 있는 외부(프로그램의 메모리에 없는 사항)를 세지 않는 한, 카운트에 대한 올바른 유형은 거의 항상 존재한다.size_t이것이 모든 표준 C 함수가 사용되는 이유다.size_t셈고고 아주 타당한 이유가 없는 한 다른 것을 사용할 생각은 하지 마라.

단점

가 C의 는 바로 C언어가 C의 크기를 명시하지 않는 것이다.int또는long, 등은 계산 효율을 위한 것이다.각 아키텍처는 자연스럽고 가장 효율적인 크기를 가지고 있으며, 설계자는 특별히 컴파일러 구현자가 속도와 코드 크기 효율을 위해 자연적인 네이티브 데이터 크기 데이터를 사용할 수 있도록 권한을 부여하고 의도했다.

과거에는 다른 기계와의 통신이 주요 관심사가 아니었기 때문에(대부분의 프로그램은 기계와 국부적 관계였다) 각 데이터 유형 크기의 예측 가능성은 거의 관심사가 되지 않았다.

특정 아키텍처가 특정 크기를 사용한다고 주장int비록 그것이 다른 것들을 더 쉽게 만드는 것처럼 보일지라도, 함께 세는 것은 정말 나쁜 생각이다.

어떻게 보면 XML과 그 동료들 덕분에 데이터 유형 크기는 더 이상 큰 문제가 되지 않는다.기계에서 기계로 운송하는 기계 특유의 이항구조는 규칙이라기 보다는 예외다.

내가 메모리에 가지고 있는 데이터가 2진법 형태로 디스크/네트워크/디스크립터에 저장되어야 하는 경우 나는 오직 한 가지 이유로 stdint 유형을 사용한다.당신은 리틀 엔디안/빅 엔디안 문제와 싸우기만 하면 되지만 그것은 비교적 극복하기 쉽다.

stdint를 사용하지 않는 분명한 이유는 코드의 크기가 독립적일 때, 수학에서는 합리적인 정수에서 작용하는 모든 것을 용어로 표현한다.만약 당신이 그것을 제공한다면 추악한 코드 중복이 생성될 것이다.uint*_t예를 들어,qsort()의 모든 확장에 대하여*.

그 경우에서 파생된 나만의 유형을 사용한다.size_t내가 게으르거나 내가 없을 때 플랫폼에서 가장 많이 지지되는 부호 없는 정수일 때.

편집, 이전에 이 문제가 발생했으므로:
내 생각엔 적어도 이 일은 주목할 만한 일이다.uint8_t,uint32_t그리고uint64_tSolaris 2.5.1에서 파손됨.그래서 최대한의 휴대성을 위해 나는 여전히 피하기를 제안한다.stdint.h(적어도 향후 몇 년 동안).

참조URL: https://stackoverflow.com/questions/9834747/reasons-to-use-or-not-stdint

반응형