从QString获取“const wchar_t *”的最快方法是什么?

时间:2014-04-17 04:44:07

标签: c++ qt qstring wchar-t

我想将QString变量传递给带const wchar_t*参数的函数。

安全解决方案是:

void foo(const wchar_t*);
QString x = "test";
foo(x.toStdWString().c_str());

但它有转换为wstring的开销。有没有更快的解决方案?

这个解决方案怎么样?它安全便携吗?

foo(reinterpret_cast<const wchar_t*>(x.constData()));

2 个答案:

答案 0 :(得分:6)

不,重新解释强制转换是不安全的,并且在编码不同的某些平台上不起作用。 QChar是16位,内部编码是UTF-16,但在Linux wchar_t上是32位UCS-4编码。

wchar_t永远停留在16位的Windows上,演员阵容会发生工作(它仍然是未定义的行为,但msc ++目前不会做任何会破坏它的事情),但是使用Qt是可移植的,对吧?

请注意,通过std::wstring进行转换的效率与您获得的效率相同。鉴于编码内存的差异必须分配一次,由std::wstring管理(即使在C ++ 98中也可以省略返回副本),std::wstring::c_str()是一个微不足道的getter。

答案 1 :(得分:-1)

如果x.constData为您提供可查询为const wchar_t*的数据,则您不会需要演员。

任何在没有强制转换的情况下都不会编译的情况会严重破坏(非法别名,很可能也是不兼容的编码)。

看起来正确的方式是x.utf16()(没有演员表),即使那时wchar_t只有unsigned short。见http://qt-project.org/doc/qt-4.8/qstring.html#utf16

QString始终为UTF-16,因此如果wchar_t不是,则没有转换的方法。