4

これが私がスピードアップしたいコードです。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;
4

5 に答える 5

3

問題(_bstr_t内のメモリコピーの可能性を除く)は、UNICODEBSTRをANSI文字*に変換していることです。

スタックで変換を実行するUSES_CONVERSIONマクロを使用できるため、より高速になる可能性があります。または、可能であればBSTR値をUnicodeのままにします。

変換する:

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

// ...

free(p);

覚えておいてください-OLE2A(およびその姉妹マクロ)から返された文字列は、スタックに割り当てられた文字列を返します-囲んでいるスコープから戻り、コピーしない限り(そして明らかに最終的には解放しない限り)ガベージ文字列があります

于 2008-09-22T21:33:05.080 に答える
3

BSTR の最初の 4 バイトには長さが含まれます。ループして、ユニコードの場合は 1 文字おき、マルチバイトの場合はすべての文字を取得できます。ある種の memcpy またはその他の方法も機能します。IIRC、これはW2Aまたはキャストよりも高速になる可能性があります(LPCSTR)(_bstr_t)

于 2008-09-23T00:36:15.887 に答える
2

これにより、スタックに一時的なものが作成されます。

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

これは少し新しい構文を使用しており、おそらくより堅牢です。サイズは構成可能であり、それを超えるとヒープが使用されるため、スタックに大量の文字列が配置されるのを防ぎます。

char *p=CW2AEX<>(var.bstrVal);
于 2008-09-22T21:32:47.217 に答える
0
_variant_t var = pRs->Fields->GetItem(i)->GetValue(); 

また、フィールド コレクションをまとめて回避することで、この割り当てをより迅速に行うこともできます。名前で項目を取得する必要がある場合にのみ、Fields コレクションを使用してください。インデックスによるフィールドがわかっている場合は、代わりにこれを使用できます。

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

ADO は VT_INTEGER をサポートしていないため、i を整数にすることはできません。そのため、長い変数を使用することもできます。

于 2010-03-04T12:15:23.653 に答える
-2

さて、私のC ++は少し錆びてきています...しかし、変換はあなたの問題ではないと思います。その変換は、コンパイラに_bstr_tをchar*と見なすように指示する以外は実際には何もしません。次に、そのポインタのアドレスをpに割り当てるだけです。実際には何も「行われていない」。

GetValueからの取得が遅いだけではありませんか?

または、私のC++は私が思っているよりも錆びています...

于 2008-09-22T21:34:17.730 に答える