2016-10-03 2 views
0

내가 작성한 코드 스 니펫을보고 있었는데 movsxd 연산은 ret 변수가 32 비트 인 경우에만 나타납니다. ret이 64 비트이면 직접 사용됩니다 : mov BYTE PTR [rdi+rbp+86], al. mov 연산 이후C에서 64 비트 플랫폼을 타겟팅 할 때 배열 참조에 64 비트 변수를 사용하는 것이 더 좋습니까?

; 861 :  _BitScanForward(&depth, subject); 

    movsx edx, dx 

; 862 :  qry_args->lo_refs[++ret] = (BYTE)depth; 

    inc ebp        // ret is in ebp 
    bsf ecx, edx 
    movsxd rax, ebp     // convert 32-bit ebp to 64-bit rax 

; 865 :  subject ^= (1 << depth); 
; 866 :  nulls_mask.lo |= (1 << depth); 

    movsx r9d, r9w 
    btc edx, ecx 
    bts r9d, ecx 
    mov BYTE PTR [rax+rbx+86], cl  // 64-bit rax used by mov 

64 비트 레지스터 64 비트 모드에서, 그것은 (예를 들면 어레이 referencers 같은) 메모리를 참조하는 데 사용되는 임의의 변수에 이상적으로는 64 비트이어야 나에게 의미가 필요하다.

그러나 나는 2 ^^ 31 반복을 초과하지 않을 루프에서 단순히 int을 사용하는 것이 일반적이라는 것을 알고 있습니다. 실제로 long long (int64)을 64 비트 코드의 모범 사례로 사용해야합니까? 이것에 대한 의견?

여기에 표시된 것 이상으로 이것을 테스트하는 데 문제가 없습니다.

ps. 이것은 미세 최적화 질문이 아닙니다. 그것은 형태의 문제입니다. 나에게는 컴파일러에서 사용하는 유형을 사용하는 것이 좋습니다.

정보 : 최대 최적화가 적용된 VS 2016으로 컴파일 중입니다.

+0

"_ 셀 참조 포인터와 같은 메모리를 참조하는 데 사용되는 _variables는 쓰기 포인터이며 따라서 64 비트 메모리 구성에서 64 비트가되어야합니다. 'int'는 기계 레지스터의 네이티브 크기입니다. –

+0

'int'는 4 바이트입니다. https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx https://www.google.com.tw/webhp#q=size%20of%20int%20in%20c – IamIC

답변

4

배열 색인에 size_t 유형을 사용하십시오. 배열 인덱스를 보유 할만큼 충분히 큽니다. 일반적으로 64 비트 플랫폼에서는 64 비트를, 32 비트 플랫폼에서는 32 비트를 보유합니다.

일반적으로 귀하의 경우 long long를 사용하는 것은 좋지 않습니다 https://stackoverflow.com/a/2550799/909655

+0

관심 장소 size_t를 사용하도록 코드를 수정하면 ASM 작업 수가 1 % 이상 약간 줄어 들었습니다. 그것은 확실히 말하고 있습니다. – IamIC

3

를 참조하십시오. 코드를 읽는 다음 개발자는 코드가 큰 숫자를 처리해야하거나 원래 프로그래머가 자신이하는 일을 알지 못한다고 생각할 것입니다.

size_t (변수가 모든 배열 크기를 처리 할 수 ​​있어야 함을 나타냄) 또는 int (정상 범위 요구 사항을 갖는 일반 용도 변수 임) 중 하나를 사용하는 것이 좋습니다.

어떤 정수 유형을 선택해야합니까?

은 일반 정수 변수에 사용됩니다. 이것은 다른 유형을 선택할 이유가 없으면 사용해야하는 유형입니다. 그것이 사용 사용하기 적당한 크기 (어떤 이유, 그러나 전형적으로 플랫폼 범위, 메모리 소모 및 성능 사이의 적절한 트레이드 오프)

CHAR이므로 int 플랫폼 개발자로 선정 된 크기를 갖는다 문자열 및 이진 데이터의 경우 이진 연산자 (특히 시프트 연산자)를 사용하려는 경우 부호없는 char을 사용해야합니다. 필요

어레이/메모리 크기, 배열의 인덱스에 사용이 size_t는 등

다른 INT 크기 (짧은, 긴 긴 고정 크기)가 사용된다. 고정 크기는 일반적으로 서로 다른 시스템간에 교환되는 데이터에 사용됩니다.long/short는 표준 함수의 반환 값이 각각의 크기 일 때 일반적으로 사용됩니다. long long은 큰 숫자를 저장할 필요가있을 때 사용되지만, 정말로 큰 정수의 경우 BigInt 라이브러리가 필요합니다.

+0

매우 도움이됩니다. 감사합니다. – IamIC

+0

중요한 점은 size_t를 사용하도록 코드를 수정하면 ASM 작업 수가 1 % 이상 약간 줄었습니다. 그것은 확실히 말하고 있습니다. – IamIC

+0

@IamIC 일반적으로 성능이 아닌 코드 가독성을 위해 최적화됩니다. 성능 최적화 코드는 성능이 중요한 코드를 다루는 경우에만 필요합니다. https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize –

관련 문제