2012-05-09 3 views
7

BOOL의 크기가 4 바이트 (예 : 4의 배수)이기 때문에 BOOL (typedef int)을 사용하는 것이 표준 C++ 유형 bool보다 낫다는 것을 읽었습니다. 변수를 레지스터 또는 그 라인에있는 어떤 것으로 정렬하는 작업 ...성능을위한 BOOL (typedef int) 대 bool

이게 무슨 진실이 있습니까? 나는 컴파일러가 bool (1 바이트)을 사용하더라도 4의 배수의 정렬을 유지하기 위해 스택 프레임을 채울 것이라고 상상한다.

필자는 결코 정렬, 레지스터 등의 기본 동작에 대한 전문가가 아니므로 완전히 잘못했을 경우 사전에 사과드립니다. 나는 시정되기를 희망한다. :)

건배!

+6

'bool'이 4 바이트보다 빠를 경우 컴파일러는 4 바이트로 만듭니다. 시나리오에 따라 다릅니다. 따라서 BOOL은 성능상의 이점을주지 않습니다. – tenfour

+0

이것은 프로파일 링을 통해서만 발견 할 수있는 것이지만 0,1 이외의 값을 가질 수있는 bool을 원하십니까? 심지어 부정적인 가치? – juanchopanza

+0

아무런 차이가 없습니다. 컴파일러는 값이 올바르게 정렬되도록 값을 채 웁니다. 가장 합리적인 유형을 사용하십시오. 부울 값이면 'int'(또는 일부 typedef)가 아닌 'bool'이되도록합니다. –

답변

7

우선, sizeof(bool)은 반드시 1 일 필요는 없습니다. implementation-defined이므로 컴파일러 작성자는 대상 플랫폼에 적합한 크기를 자유롭게 선택할 수 있습니다.

또한 sizeof(int)은 반드시 4 일 필요는 없습니다.

성능에 영향을 줄 수있는 여러 문제가 있습니다

  • 정렬;
  • 메모리 대역폭;
  • 기계어보다 더 좁은 값을 효율적으로로드하는 CPU 기능.

특정 코드 조각에 어떤 차이가 있는지는 해당 코드를 프로파일 링하여 만 설정할 수 있습니다. 당신은 C++에서 얻을 수

+0

그리고 컴파일러는이 문제를 반영하기 위해'bool'의 크기를 조정했을 것입니다. –

+0

일반적으로 말하기; 예를 들어, bool은 1 바이트이고 int는 4 바이트라고합니다. struct {bool x; int y}; x가 크기가 4의 배수가 아니기 때문에 y가 잘못 정렬되는 원인이됩니까? 또는 y가 정렬되도록 컴파일러가 주소를 채 웁니까? –

+1

@KarlHansson : 패딩은 구현에 따라 다릅니다. 필자가 잘 알고있는 구현은'x' 뒤에 패딩을 삽입하여'y'가 적절히 정렬되도록합니다. – NPE

2

유일한 보증 크기는 항상 정확히 하나의 바이트 및 모든 플랫폼에 대해 정의 된 char, unsigned char2)signed char와. 0)1)


0) 바이트가 정의 된 크기를 가지고 있지 않지만. sizeof(char) 항상 1 byte이지만, 사실

1) 예, uint32_t과 친구가 있지만, 그들의 정의는 실제 C++ 구현에 대한 선택 사항입니다 40 진수 비트 수 있습니다. 을 사용하지만, 당신이 얻을 수 그들이 사용할 수없는 경우

2) char, unsigned charsigned char는 별개의 종류 (시간 오류는 항상 좋은 컴파일) 시간 오류를 컴파일하고 char인지 정의되지 않은 signed 또는 아니. 함수 오버로드 및 템플릿 작성시이를 명심하십시오.

0

논리 값에 관해서 세 가지 일반적으로 받아 들여지는 성과 중심의 관행이 있습니다

  1. 표현 문제 하나를 확인하는 경우 명령문 위해 그들에주의 할 필요가.
  2. 부울 표현식을 검사 할 때 분기 예측 오류가 많이 발생하면 가능하면 해킹이 조금 복잡해집니다.
  3. 부울은 가장 작은 데이터 형식이므로 부울 변수는 구조 및 클래스에서 마지막으로 선언해야하므로 패딩이 구조체 메모리 레이아웃에 눈에 띄는 구멍을 추가하지 않도록해야합니다.

하지만 (부호없는) 정수로 부울을 대체하여 성능 향상에 대해 들어 본 적이 없습니다.

+0

# 3은 반드시 사실이 아닙니다. (정렬/자동 채우기로 인해) 구조체에 이미 간격이있는 시나리오에서는 bool을 배치하여 "공짜"에 대한 간격을 "채울"수 있습니다. 이제까지이 구조체가 이미 캐시 라인 크기의 완벽한 배수 인 크기를 가지고 있다고 가정하고, 갭을 채우는 대신에 구조체의 끝에 bool을 추가하면 시도 할 때 실제로 캐시 미스가 발생할 것입니다 해당 bool 멤버에 액세스 할 수 있습니다 (그렇지 않으면 cache-miss가 발생하지 않습니다). 각 구조체를 독립적으로 판단해야합니다. –

+0

@PreetKukreti 네 말이 맞아, 나는 '기본 플랫폼에 대한 지식이 필요없는 일반적으로 받아 들여지는 관행'이라고 말해야했다. SW가 실행될 플랫폼을 알고 있다면 예 (4 또는 8 또는 ...)를 알 수 있고 그에 따라 조정할 수 있습니다. 구멍을 채우거나 캐시 라인에 정렬 할 수 있습니다. 목록은 부울을 다루는 일반적인 규칙이었다. –