2010-12-31 5 views
0

저는 암호화 방법을 위해 일종의 나노초 레벨 타이밍을 찾는 방법을 찾으려고합니다. stackoverflow에서이 코드를 발견하고 그것은 VS2010에서 컴파일하는 것처럼 보일 수는 없지만 그 이유를 알 수 없습니다. 오류는 'time = GetCpuClocks()'이며 "C3861 오류 : 'GetCpuClocks': 식별자를 찾을 수 없습니다. '라는 메시지가 표시됩니다. 이유는 무엇입니까? 구조체 선언에서 'int32'형식의 문제도 발생했습니다.C++에서이 코드에 문제가 있습니까?

(나는 '긴'로 '시간'을 선언 시작하더라도 확인입니까? 아니면 __int64 사전에?

감사 했어야

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    __int64 time; 
    time = GetCpuClocks(); 
} 

inline __int64 GetCpuClocks() {  
    // Counter  
    struct { int32 low, high; } counter;  

    // Use RDTSC instruction to get clocks count  
    __asm push EAX  
    __asm push EDX  
    __asm __emit 0fh 
    __asm __emit 031h 

    // RDTSC  
    __asm mov counter.low, EAX  
    __asm mov counter.high, EDX  
    __asm pop EDX  
    __asm pop EAX  

    // Return result  

    return *(__int64 *)(&counter); 
} 
+0

당신은 아마 * 후 * GetCpuClocks() ... – kem

+0

좋아 사람을 _tmain 넣어해야 내가 내가 먼저 방법을 선언해야한다고 알았어! 내 유일한 qyestion 왜 int32 같은 큰 번호를 사용하고 있습니까? 내 가치 중 일부는 -xxxxxxxxx는 내가 64 비트 숫자를 통해 사용해야한다는 뜻입니까? – Jason

+0

'나노초 레벨 타이밍 '당신은 그것을 발견하지 못할 것입니다. 너무 많은 변수가 있습니다. 이 함수는 시간이 정말 빨라지지만, 타이밍 것들을위한 것이 아닙니다. – Falmarri

답변

6

는 주

__int64 GetCpuClocks(); 
위의 서명을 넣어
0

코드는 4 행의 GetCpuClocks()를 참조하지만 GetCpuClocks는 7 행까지 정의되지 않습니다.

0

함수 정의의 순서를 변경하십시오. GetCpuClocks는 main에서 호출하기 전에 정의되거나 전달되어야합니다.

2

당신은 데이터 형이 undersocres를 추가 할 필요가 다음 ASM 명령은 32 비트 레지스터를 사용하고, 따라서 32 비트 정수가 많이 있기 때문에 __int32

32 비트 정수를 사용해야하는 이유는 하나의 64 비트 정수보다 복사가 빠릅니다. 리턴 명령문의 형변환은 여분의 시간을 거의 또는 전혀하지 않고 두 개의 32 비트 정수를 최종 64 비트 결과로 결합합니다.

int와 long 대신 __int32와 __int64를 사용하는 이유는 __int32/64가 보편적으로 크기를 설정하기 때문입니다. 반면 short, int 및 long은 기술적으로 컴파일러와 플랫폼 아키텍처에 따라 가변 크기를가집니다.

(물론, 당신은 이미 기능이 역순으로 선언 할 필요가 있다는 사실을 알고있다.)

관련 문제