문제

속도를 높이고 싶은 코드는 다음과 같습니다.ADO 레코드 세트에서 값을 가져와서 char*로 변환합니다.그러나 이것은 느립니다._bstr_t 생성을 건너뛸 수 있나요?

                _variant_t var = pRs->Fields->GetItem(i)->GetValue();

                if (V_VT(&var) == VT_BSTR)
                {
                    char* p = (const char*) (_bstr_t) var;
도움이 되었습니까?

해결책

BSTR의 처음 4바이트에는 길이가 포함됩니다.유니코드인 경우 루프를 통해 다른 모든 문자를 가져오거나 멀티바이트인 경우 모든 문자를 가져올 수 있습니다.일종의 memcpy 또는 다른 방법도 작동합니다.IIRC, 이것은보다 빠를 수 있습니다 W2A 또는 캐스팅 (LPCSTR)(_bstr_t)

다른 팁

문제(_bstr_t 내부의 메모리 복사 가능성 제외)는 UNICODE BSTR을 ANSI char*로 변환한다는 것입니다.

스택에서 변환을 수행하는 USES_CONVERSION 매크로를 사용할 수 있으므로 속도가 더 빨라질 수 있습니다.또는 가능하면 BSTR 값을 유니코드로 유지하십시오.

변환하다:

USES_CONVERSION;
char* p = strdup(OLE2A(var.bstrVal));

// ...

free(p);

기억하세요 - OLE2A(및 그 자매 매크로)에서 반환된 문자열은 스택에 할당된 문자열을 반환합니다. - 둘러싸는 범위에서 반환되며 복사하지 않는 한 가비지 문자열이 있습니다(그리고 결국에는 당연히 해제됩니다).

그러면 스택에 임시가 생성됩니다.

USES_CONVERSION;
char *p=W2A(var.bstrVal);

이는 약간 더 새로운 구문을 사용하며 아마도 더 강력할 것입니다.구성 가능한 크기가 있으며 그 이상에서는 힙을 사용하므로 스택에 막대한 문자열을 넣는 것을 방지합니다.

char *p=CW2AEX<>(var.bstrVal);
_variant_t var = pRs->Fields->GetItem(i)->GetValue(); 

필드 수집을 모두 피함으로써 이 할당을 더 빠르게 수행할 수도 있습니다.이름으로 항목을 검색해야 하는 경우에만 Fields 컬렉션을 사용해야 합니다.인덱스별로 필드를 알고 있다면 대신 이것을 사용할 수 있습니다.

_variant_t vara = pRs->Collect[i]->Value;

ADO는 VT_INTEGER를 지원하지 않으므로 i는 정수일 수 없으므로 긴 변수를 사용할 수도 있습니다.

좋아, 내 C++이 조금 녹슬고 있어...하지만 나는 전환이 당신의 문제라고 생각하지 않습니다.해당 변환은 컴파일러에게 _bstr_t를 char*로 간주하도록 지시하는 것 외에는 실제로 아무 것도 수행하지 않습니다.그런 다음 해당 포인터의 주소를 p에 할당하면 됩니다.실제로 "완료"되는 것은 없습니다.

GetValue에서 물건을 가져오는 것이 단지 느린 것이 아니라는 것이 확실합니까?

아니면 내 C++이 생각보다 녹슬었나...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top