2016-10-01 2 views
0

프로그램을 작성하고 255보다 낮은 숫자가 필요한 경우 숫자를 사용하기 위해 unsigned char 유형을 사용하는 것이 좋습니다 (예 : 번호를 루프로 만들 필요가있는 경우)? 전통과 컨벤션을 고수하고 int 및 float 등으로 숫자를 선언하는 것을 포함하여 어떤 이유가 있습니까?적은 수만 필요할 때 unsigned char을 사용할 수 있습니까?

예를 들어,이 코드는 절대로 사용하지 않아야합니까? 또는 짧은 int보다 적은 메모리를 할당하므로이 경우 unsigned char을 사용하는 것이 좋습니다.

#include <stdio.h> 

typedef unsigned char short_loop; 

int main(int argc, char *argv[]) 
{ 
    short_loop i; 

    for(i = 0; i < 138; i++) 
     printf("StackOverflow Example Code\n"); 

    return 0; 
} 

나는 나중에 참조 할 수 있도록 위의 코드를 사용하여 설명하고 있습니다.

+1

예를 들어 작은 수의 큰 배열 일 때만 좋은 방법입니다. 하나의 int 대신 하나의 char을 사용하면 전체 메모리에 거의 차이가 없습니다. – Natecat

+1

char은 정수형입니다. 왜 숫자를 저장하는 것이 유용하지 않습니까? 내장 유형 간의 성능 차이에 대한 설명은 [this] (/ questions/5069489/built-in-types-char-vs-short-vs-int -vs-float-vs-double)을 참조하십시오. 귀하의 8 비트 int를 사용하여 실제로 더 큰 하나를 사용하는 것보다 느려질 수 있습니다 – Tibrogargan

+0

어떤 이유 ** ** int에 충실하지 ** 있습니까? 당신의 코드는 잘 작동하지만'int' 대신에'unsigned char'을 사용하면 무엇을 얻을 것이라고 생각합니까? 대부분의 경우 현대 컴파일러는 특정 시스템에 "최선"인 모든 작업을 수행하므로 전혀 문제가되지 않습니다. – 4386427

답변

2

나는 그것을하지 않을 것이다.

큰 값 배열을 사용하는 프로그램의 경우 int 배열보다 char 배열을 사용하면 메모리 사용량 측면에서 이점이 있습니다.

그러나 단일 루프의 제어 변수의 경우 여러 가지 이유로 많은 이점과 잠재적으로 성능에 영향을 줄 가능성은 거의 없습니다. 138 유형 int이기 때문에

i < 138을 비교하면, 비교를하기 전에 inti을 촉진 할 것이다. 프로모션 (및 다운 컨버전)은 또한 i의 초기화 및 증가와 함께 발생할 수 있습니다.

int은 일반적으로 호스트에서 선호하는 유형 (예 : 하드웨어가 해당 유형에서 작동 할 때 성능을 위해 최적화 된 레지스터를 제공함) 인 호스트 시스템의 "기본 유형"입니다. 루프에서 비교하기 전에 unsigned char ~ int의 프로모션을 방지하는 데 사용되는 기술이 있어도 int의 연산이 더 효과적 일 수 있습니다.

결국 결국 접근 방식이 성능상의 이점을 줄 수도 있고 아닐 수도 있습니다. 코드를 프로파일 링하는 유일한 방법은 컴파일러 의존 (예 : 최적화 접근법) 및 호스트 종속 (예 : unsigned char의 연산이 다음과 같은 연산과 비교하여 얼마나 효율적인지 등)입니다. int)

당신의 접근법은 코드를 이해하기 어렵게 만들고, 따라서 올바른 결과를 얻지 못하게합니다. 그리고 다른 프로그래머 (또는 사용자)가 나중에 코드를 수정하면 의도하지 않은 유형 변환을 실수로 다시 도입하여 이익이 무효화 될 수 있습니다.

1

PC와 함께 사용하면 좋지 않습니다. 임베디드 장치에서 사용하려면 - 다릅니다.

255를 초과하지 않는다고 보장되면 어쨌든 int로 변환되지만 메모리 차이는 그리 중요하지 않습니다.

가독성을 보장합니다.


다른 사람들은 귀하가 불필요하게 코드를 난독 화한다고 말했기 때문입니다. 형식 정의를 사용하면 추한 이름을 부여 할 수도 있습니다. 인덱스는 int 유형으로 알려져 있습니다. 그리고 그게 다야.

2

예, unsigned char을 사용하는 것이 좋습니다. 나는 short_loop typedef를 사용하지 않을 것이고, 아무런 이유없이 코드를 난독화할뿐입니다.

uint8_t을 사용하는 경우 인 텐트가 문자 데이터 대신 작은 정수임을 강조하는 사람도 있습니다. 이 unsigned char의 typedef 일 가능성이 높습니다.

이론적으로 "부호없는 정수 유형, 최소 8 비트 및 가능한 가장 빠른 유형"을 의미하는 typedef 을 사용할 수 있습니다. 분명히 "가장 빠른"해석은 다소 모호합니다.

+0

uint8_t를 사용 하시겠습니까? – Malina

+0

@Malina 개인적으로'int'를 사용 하겠지만, 기술적 인 이유보다 개인적인 선호도가 더 중요합니다. –

+0

int가 아닌 다른 것을 사용하는 것은 그리 일반적이지 않습니다. 그리고'uint8_t '는 존재하는 것이 보장되지 않습니다. 이 조기 최적화 (메모리 측면에서)는 가독성이 떨어지며 리터럴이 255를 넘어서는 경우 수정해야합니다. 많은 프로그램에서 마술 번호를 피하기 위해 정의하고 일부 경우에는 사용자 정의를 허용하는 정의가 있습니다. 자신의 시간은 문자열. 그것은 명시 적으로 리터럴을 루프에서 두 번 (즉 BP 계열의 최적화) 변환해야합니다. 이는 성능을 위해서입니다. 그러나 중요하지 않습니다. 3 바이트 절약과 같습니다. – Malina

관련 문제