这是我想加快代码。 这是一个从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个字节的BSTR的含有长度。 可以遍历如果Unicode或每一个字符,如果多字节得到所有其他字符。 某种的memcpy或其他方法将工作太。 IIRC,这可能快于W2A
或铸造(LPCSTR)(_bstr_t)
您的问题(比内部_bstr_t内存复制的可能性除外),你转换UNICODE BSTR到ANSI字符*。
您可以使用USES_CONVERSION宏其执行堆栈上的转换,所以他们可能会更快。 另外,保持BSTR价值为Unicode如果可能的话。
转换:
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一个整数,所以你还不如用一个长变量。
好吧,我的C ++越来越有点生疏...但我不认为转换你的问题。 这转换并没有真正做除了告诉编译器要考虑_bstr_t一个char *什么。 然后,你只是分配该指针p的地址。 没有什么是实际上是被“做”。
你肯定不只是延缓的GetValue得到的东西?
或者是我的C ++ rustier比我想...