使用MSVC(full source)
编译此示例时#include <QString>
#include <QDebug>
static __forceinline QString makeString() {
return {};
}
int main()
{
QString str = makeString();
qDebug() << str;
return 0;
}
发出以下警告:
function 'QString makeString(void)' marked as __forceinline not inlined
编译时,我使用默认的qmake设置(加上-W4
警告):
cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -O2 -MD -GR -W4 -EHsc
-w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4127 -w34100
-DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG
-IC:\home\dev\qstring_inline -I. -I..\..\qt\qt_5.5.1\build\qtbase\include -I..\..\qt\qt_5.5.1\build\qtbase\include\QtGui -I..\..\qt\qt_5.5.1\build\qtbase\include\QtCore -Irelease -Ie:\builds\qt\qt_5.5.1\qt5\qtbase\mkspecs\win32-msvc2015 -Forelease\ @C:\Users\ens\AppData\Local\Temp\main.obj.17344.16.jom
main.cc
我已使用Qt 5.5.1
,Qt 5.4
和VS 2015 Update 1, 64-bit MSVC
,VS 2013 Update 5, 64-bit MSVC
重现了此问题。
检查程序集确认确实生成并调用了makeString()。
默认构造函数(code browser)......
inline QString::QString() Q_DECL_NOTHROW : d(Data::sharedNull()) {}
...和右值复制构造函数(code browser)
inline QString(QString && other) Q_DECL_NOTHROW : d(other.d) { other.d = Data::sharedNull(); }
非常简单。 什么可以阻止makeString()被内联?
答案 0 :(得分:3)
编译器无法内联具有非平凡析构函数的返回类型的函数。这是编译器的限制;编译器团队正在考虑为将来的版本改进这一点。