programing

그 sizeof(enum)== sizeof(int), 항상?

javaba 2022. 8. 7. 17:51
반응형

그 sizeof(enum)== sizeof(int), 항상?

그 sizeof(enum)== sizeof(int), 항상?

  • 아니면 컴파일러 피 부양자?
  • 특정한 컴파일러에 yint는 word-size 그대로 길이 ie(메모리 맞춤)으로 컴파일러 최적화된 말 틀린 건가요?할 정렬 단어 내가 enums을 사용하는 것이 없처리 제도를 의미하나요?
  • 만약 나는 enum의 모든 반환 코드를을 넣는 반환 형식을 체크하는 것 나는 분명히려면 가치에 대해서만 이름 걱정하지 않는다,이 낫지 않은가.만약 이것이 사례로 기억을 살릴 수 있다고 평소 더 좋을 DEFINE #.

무엇이 일반적인 연습은?만약 내가 네트워크를 통해 이 반환 형식을 수송하는 것과 처리하는 몇몇의 다른 쪽 끝에 뭐enums/#defines/ const 지문을 평소와는 될 수도 있습니다.

편집-로 complier 상징적으로 매크로 연계하지 않아 그냥 네트 위에, 점검, 어떻게 사람들은 그 후, 헤더 파일과 함께 정수 값과 디버깅 하니?

2002부터 —I 있어 추가 이 선 아래로는, 내가 필요한 clarifications—.

"그래서인지, 그리고 sizeof(enum)sizeof에 까맣게 태우다)동등한, 즉 1implementation-defined.".

  • 이것은 가치의 enums의 범위에 그 컴파일러를 확인한 다음 메모리를 할당을 의미하지 않습니다.나는 그렇다면, 물론 나는 몰라.누군가 무슨" 될 것"은 설명해 줄 수 있다.

그것은 컴파일러와 enums 사이에 다를 수 있게 의존하고 있다.다음은 의미론입니다.

enum X { A, B };

// A has type int
assert(sizeof(A) == sizeof(int));

// some integer type. Maybe even int. This is
// implementation defined. 
assert(sizeof(enum X) == sizeof(some_integer_type));

C99 의 「일부 정수 타입」에는, 확장 정수 타입도 포함되어 있는 것에 주의해 주세요(다만, 실장에서는, 그러한 타입을 제공하는 경우는 문서화할 필요가 있습니다).은 임의의 「」 「」 「」 「」)의할 수 있는 입니다.A ★★★★★★★★★★★★★★★★★」B(어느 쪽인가)

열거를 사용해도 벌칙은 없다고 생각합니다.열거자 역시 정수 표현식입니다(예를 들어 정적 변수나 파일 범위 변수를 초기화하기 위해 사용할 수 있습니다). 가능하면 매크로보다 선호합니다.

열거자에는 런타임 메모리가 필요하지 않습니다.열거형 변수를 생성하는 경우에만 런타임 메모리를 사용할 수 있습니다.열거자를 컴파일 시간 상수라고 생각하면 됩니다.

열거자 값(값의 대략적인 범위를 미리 알고 있어야 함)을 저장하고 캐스트하여 네트워크를 통해 전송할 수 있는 유형만 사용합니다.는 넓이가 것이 . 를 들어 넓이가 일정한 이 좋다.int32_t서로 다른 기계가 관련되어 있을 때 충돌이 발생하지 않습니다.아니면 숫자를 인쇄해서 반대쪽에서 스캔하면 문제가 없어집니다.


편집에 대한 응답

컴파일러는 어떤 사이즈도 사용할 필요가 없습니다.쉽게 알 수 있는 것은 값의 부호가 중요하다는 것입니다. 부호 없는 유형은 일부 계산에서 상당한 성능 향상을 가져올 수 있습니다.은 GCC의 입니다.4.4.0 위에

int main(void) {
  enum X { A = 0 };
  enum X a; // X compatible with "unsigned int"
  unsigned int *p = &a;
}

, ,을 하면 를이 할당됩니다.-1 후 GCC는 "GCC"를 하도록 선택합니다.int의 타입으로서X이 있습니다.

int main(void) {
  enum X { A = -1 };
  enum X a; // X compatible with "int"
  int *p = &a;
}

" " " "--short-enumsGCC는 GCC를 사용합니다.

int main() {
  enum X { A = 0 };
  enum X a; // X compatible with "unsigned char"
  unsigned char *p = &a;
}

GCC에서는 가 "GCC"로되었습니다.-fshort-enums일부 타깃에서는 기본 유형이 다음과 같습니다.unsigned int정답은 이쪽에서 확인하실 수 있습니다.

아니요.

예:CodeSourcery 컴파일러

다음과 같이 열거형을 정의하는 경우:

enum MyEnum1 {
A=1,
B=2,
C=3
};
// will have the sizeof 1 (fits in a char)

enum MyEnum1 {
A=1,
B=2,
C=3,
D=400
};
// will have the sizeof 2 (doesn't fit in a char)

메일링 리스트의 상세

size of(enum) == size of(int), 항상

ANSI C 표준에는 다음과 같이 기술되어 있습니다.

열거된 각 유형은 char, 부호 있는 정수형 또는 부호 없는 정수형과 호환되어야 합니다.유형을 선택할 수 있습니다. (6.7.2.2 열거 지정자)

그래서 나는 그것을 아니라고 받아들일 것이다.

이 경우 메모리를 절약할 수 있으므로 #DEFINE이 더 나을 수 없습니다.

정의 save memory는 enum을 사용하는 것보다 어떤 방식으로 사용합니까?열거형은 컴파일러에 더 많은 정보를 제공할 수 있는 유형입니다.실제 실행 파일에서는 프리프로세서가 #define in으로 작성된 매크로를 그 값으로 변환하는 것처럼 정수로 변환됩니다.

일반적인 관행은 무엇입니까?이러한 리턴 타입을 네트워크를 통해 전송해야 하는 경우, 일부 처리는 반대쪽에서 수행해야 합니다.

네트워크를 통해 값을 전송하고 상대편에서 처리하려는 경우 프로토콜을 정의해야 합니다.endianess(바이트의 순서)의 각 타입의 비트 단위로 크기를 결정하고 클라이언트와 서버 코드의 양쪽에서 그 크기를 준수하고 있는지 확인합니다.또, 그것이 효과가 있다고 해서, 당신이 옳았다고만 생각하지 마세요.예를 들어 선택한 클라이언트플랫폼과 서버플랫폼의 endianess가 일치하고 있는 경우가 있습니다만, 항상 그런 것은 아닙니다.

C99, 6.7.2p4에 따르면

열거된 각 유형은 char, 부호 있는 정수형 또는 부호 없는 정수형과 호환되어야 합니다.유형은 구현 정의, 108)이지만 열거된 모든 구성원의 값을 나타낼 수 있어야 합니다. [...]

각주 108은 다음과 같이 덧붙인다.

구현에서는 모든 열거형 상수가 표시될 때까지 정수형 선택이 지연될 수 있습니다.

따라서 구현 정의이며 size of(enum)은 size of(char)와 같을 수 있습니다.즉, 1입니다.

정수의 작은 범위를 선택할 때는 항상 벌칙이 있습니다.메모리를 작게 하면 처리 패널티가 발생할 수 있습니다.크게 하면 스페이스 패널티가 발생합니다.시공간 교환이에요.

에러 코드는 일반적으로 #defines 입니다.확장성이 필요하기 때문입니다.라이브러리에 따라 새로운 에러 코드가 추가될 수 있습니다.에넘으로는 할 수 없습니다.

일부 컴파일러에서는 Enum의 크기가 Enum에 있는 항목 수에 따라 달라집니다.(255 엔트리 미만 => 바이트, 255 엔트리 이상) 단, 이는 컴파일러 및 컴파일러 설정에 따라 달라집니다.

enum fruits {apple,orange,strawberry,grapefruit};  
char fruit = apple;  
fruit = orange;  
if (fruit < strawberry)  
...  

이 모든 것이 완벽하게 작동한다
열거 인스턴스의 특정 기본 유형을 원하는 경우 유형 자체를 사용하지 마십시오.

언급URL : https://stackoverflow.com/questions/1113855/is-the-sizeofenum-sizeofint-always

반응형