2016-08-28 8 views
3

나는 버퍼 크기를 계산하는 C++ 기능이 있습니다C++ CLI - 부호에 UINT64을 변환하는 방법^% 오래 오래 *

CalcBuffer(unsigned long long* bufferSize); 

내가 내 C#으로 나중에 다른 함수로이 결과를 전달하려는를 암호. 내 C++ \ CLI 래퍼는 다음과 같습니다

CalcBufferWrapper([Out] UInt64^% bufferSize){ 
    CalcBuffer(bufferSize); 
} 

하지만이 오류 받고 있어요 : 분명히

argument of type "System::UInt64 ^" is incompatible with parameter of type "unsigned long long *".

을, 내가 다른 형식을 사용해야하지만 유형?

+0

는 https://en.wikipedia.org/wiki/Boolean_datatype를 참조하십시오 오래 오래 INT, 옵션 확장 정수 타입, 명시 적 부울 데이터 유형, 복잡한 숫자를 표현하는 복합 형 등 여러 가지 새로운 데이터 유형, – jdweng

답변

4

UInt64^% 당신이 생각하는 바를 의미하지 않습니다. ^ 모자는 참조 유형에만 사용해야하며 UInt64는 값 유형입니다. 이렇게하는 것은 약 99 %의 시간이 잘못되었지만 C++/CLI 컴파일러는이를 받아들이고이를 "박스형 64 비트 부호없는 정수에 대한 참조"로 해석합니다. boxing conversion은 값을 객체로 바꾸고 값 유형이 System :: Object에서 파생된다는 유명한 환상을 구현합니다.

확실히 unsigned long long *과 호환되지 않습니다. 코드를 검토하여 우연히^모자를 다른 곳에서 부적절하게 사용하지 않도록하십시오. 과감한 프로세서주기 싱크 (sinks)는 코드가 필요 이상으로 느려지도록 만듭니다.

모자 사용을 중지해야합니다. 그리고 UInt64 이 관리 객체의 필드가 될 가능성이있는 이유를 다룹니다. 어떤 네이티브 코드가 실행되는 동안 가비지 컬렉터에 의해 이동 될 수 있습니다. 컴파일러가 허용하지 않으므로 (원시 코드가 현재 힙을 손상시킵니다) 완전히 비참합니다. 당신은 이동할 수있는 가치를 안정적으로 복사 제공해야합니다 :

void CalcBufferWrapper(UInt64% bufferSize) { 
    auto size = bufferSize;  // Values on the stack don't move 
    CalcBuffer(&size); 
    bufferSize = size; 
} 

또는 을 많이 더 나은, 전혀 필요가 래퍼에게 랩 된 함수와 동일한 서명을주지 :

UInt64 CalcBufferWrapper() { 
    unsigned long long size; 
    CalcBuffer(&size); 
    return size; 
} 

을 이것도 재산이어야한다는 약간의 확률.