2010-08-12 2 views
4

intptr_t의 정의는 아키텍처에 따라 다르며 한 아키텍처의 모든 균일 한 주소 공간에 액세스 할 수있는 포인터를 나타낼 수있는 용량을 보장합니다. 방법.마이크로 최적화 : 플래그/부울 유형에 대해 intptr_t 사용

Nginx (인기있는 오픈 소스 웹 서버)는 플래그 (부울)로 사용되는 유형을 정의하며이 유형은 intptr_t으로 typedef됩니다. 이제 모든 크기의 피연산자를 다루는 많은 명령어에 액세스 할 수있는 x86-64 아키텍처를 예로 들자면, 플래그를 intptr_t로 정의하는 이유는 무엇입니까? 확실히 32 비트 bool 유형을 사용하는 전통은 법안에도 잘 맞을 것입니까?

나는 32 비트 대입니다. 새로운 개발자 였을 때 8 비트 bools 논쟁이 있었고, 32 비트 bool은 프로세서 설계의 복잡성으로 인해 일반적인 경우에 더 잘 수행된다는 결론을 얻었습니다. 그렇다면 64 비트 bool로 전환해야하는 이유는 무엇입니까?

답변

2

실제로 nginx가 부울 유형으로 intptr_t을 사용하는 이유를 알고있는 사람은 nginx 개발자입니다.

말처럼, 32 비트 bool은 일반적으로 8 비트 bool보다 성능이 좋을 때가 많습니다. 필자는 벤치마킹을 전혀하지 않았지만, x86-64의 특정 상황에서는 64 비트 bool이 32 비트 bool보다 우수하다는 것이 나에게 부당하지 않은 것으로 들립니다. 예를 들어, nginx 소스에서 나는 ngnx_flag_t이 다른 (u)intptr_t typedef 유형의 구조체에서 발생 함을 발견했습니다. 32 비트 부울은 정렬 패딩으로 인해 공간을 절약 할 수 없습니다.

나는 void *로 /로부터 변환 할 목적으로 선택적인 C99 유형이므로 조금 이상한 intptr_t에 대한 선택을 찾았습니다. 그러나 내가 볼 수있는 한, 결코 그렇게 사용되지는 않습니다. 아마도이 유형은 '네이티브'워드 크기 유형에 가장 적합한 근사값을 제공합니까?

0

64 비트 bool은 x86-64에서 끔찍한 생각처럼 들립니다. 나는 그것을 쓴 사람이 당시 32 비트 포인터를 가진 32 비트 머신을 생각하고 있었다고 생각한다.

현대 x86은 정렬되지 않은로드/저장을 매우 잘 지원하고 바이트를 풀어서 즉시 레지스터를 채울 수 있습니다. x86이 기본 대상이면 8 비트 부울을 선호해야하며, 캐시 사용량이 적은 바이트를 저장하는 경우에는 esp를 사용해야합니다. 캐시가 전혀 문제가되지 않는 드문 경우이지만 32 비트는 자연 크기이며 부울을 메모리로 사용하도록 허용하여 부울을 추가하거나 직접 int으로 곱하는 경우가 있습니다. 피연산자로, movzx을로드하는 대신.

일반적인 테스트 인 경우 & 브루트 (boolean)로 분기하는 경우 메모리 또는 레지스터에 상관없이 Intel 및 AMD CPU는 8 비트와 32 비트 피연산자 간의 성능 차이가 문자 그대로 0입니다.