获取一个char *在最佳时间_variant_t(Getting a char* from a _

2019-09-20 16:03发布

这是我想加快代码。 这是一个从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;

Answer 1:

前4个字节的BSTR的含有长度。 可以遍历如果Unicode或每一个字符,如果多字节得到所有其他字符。 某种的memcpy或其他方法将工作太。 IIRC,这可能快于W2A或铸造(LPCSTR)(_bstr_t)



Answer 2:

您的问题(比内部_bstr_t内存复制的可能性除外),你转换UNICODE BSTR到ANSI字符*。

您可以使用USES_CONVERSION宏其执行堆栈上的转换,所以他们可能会更快。 另外,保持BSTR价值为Unicode如果可能的话。

转换:

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

// ...

free(p);

记住 - 从OLE2A(及其姊妹宏)返回的字符串返回是在栈上分配的字符串 - 从封闭范围内的回报,你有垃圾字符串,除非你把它复制(和自由它最终,很明显)



Answer 3:

这将创建堆栈上的一个临时:

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

这将使用的较新的语法和可能更强劲。 它有一个可配置的大小,超过此所以它避免了把大量的串到堆栈它将使用堆:

char *p=CW2AEX<>(var.bstrVal);


Answer 4:

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

您也可以让这个任务更快通过避免字段集合在一起。 当你需要通过名称检索项目时,才应使用Fields集合。 如果您知道其索引的字段,你可以使用它代替。

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

注意:我不能因为ADO不支持VT_INTEGER一个整数,所以你还不如用一个长变量。



Answer 5:

好吧,我的C ++越来越有点生疏...但我不认为转换你的问题。 这转换并没有真正做除了告诉编译器要考虑_bstr_t一个char *什么。 然后,你只是分配该指针p的地址。 没有什么是实际上是被“做”。

你肯定不只是延缓的GetValue得到的东西?

或者是我的C ++ rustier比我想...



文章来源: Getting a char* from a _variant_t in optimal time