有没有办法,在MS Visual Studio C++(2005)中优化链接时间?我们正在使用Xoreax Incredibuild进行编译加速,但没有任何链接.
目前,每个链接大约需要30秒.当我打开增量链接时,需要35-40秒.(无论我是否使用incredibuild编译项目)
有什么办法,如何配置链接器并观察需要多长时间?或者任何用于paralel链接的工具?或任何代码优化的提示,以加快链接器?
感谢Ludek Vodicka的回复
编辑:
感谢您的第一次回复和其他信息:
我是boost :: fusion和boost :: mpl库的新手.有谁能告诉我这两个图书馆之间的主要区别?
直到现在我只使用fusion :: vector和其他一些简单的东西.现在我想使用fusion :: map或MPL :: map,但我不知道如何选择正确的.
我需要地图简单类型到复杂类型(类型alisa).目前我有以下片段,这两个工作正是我需要的.
提高::融合:
typedef boost::fusion::map<
boost::fusion::pair<AliasNames::test1,int>,
boost::fusion::pair<AliasNames::test2,double>,
boost::fusion::pair<AliasNames::test3,float>
> TmapAssociations1;
typedef boost::fusion::result_of::value_at_key<TmapAssociations,AliasNames::test1>::type t;
Run Code Online (Sandbox Code Playgroud)
提高:: MPL:
typedef boost::mpl::map<
boost::mpl::pair<AliasNames::test1,int>,
boost::mpl::pair<AliasNames::test2,double>,
boost::mpl::pair<AliasNames::test3,float>
> TmapAssociations2;
boost::mpl::at<TmapAssociations2,AliasNames::test1>::type t2;
Run Code Online (Sandbox Code Playgroud)
MPL和融合之间有什么区别吗?是否存在一个库优先于另一个库的情况?
谢谢你的答复.
我想知道是否有任何宏或方式如何将Qt模型注册为QObject的属性.
例如,我有AnimalModel(http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel).
我知道我可以将它传递给QuickView的根上下文
QuickView view;
view.rootContext()->setContextProperty("myModel", &model);
Run Code Online (Sandbox Code Playgroud)
如果我通过Qml宏注册了QObject,我也可以传递这个对象来查看:
view.rootContext()->setContextProperty("obj", pDataObject);
Run Code Online (Sandbox Code Playgroud)
但是如果我想拥有保存任何数据模型的QObject呢?
例如:
class DataObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
...
AnimalModel m_modelAnimals;
//Is this possible in any way?
//Q_PROPERTY(AnimalModel modelAnimals READ modelAnimals NOTIFY modelAnimalsChanged)
};
Run Code Online (Sandbox Code Playgroud)
我发现的每个例子都显示了如何传递QAbstractListModel给根上下文.但是没有人如何将它用作QObject属性.
(我知道有QQmlListProperty但QQmlListProperty不支持部分刷新.总是需要重建所有Qml对象)
我正在尝试将 lambda 传递给通过可变参数模板定义的 std::function<> ,但这似乎不适用于 gcc。
有什么原因,为什么此代码在 gcc 7.4.0 上不起作用,但在 Visual Studio 2017 上正常工作?有什么方法可以让它在 gcc 上也能工作,而无需先手动将其转换为 std::function<> ?
#include <functional>
template<class ...TParams>
int TestFunction(std::function<void(TParams...)> )
{
return 0;
}
void Test()
{
auto fce = [](int /*n*/, double /*d*/) {};
//This doesn't work with error no matching function for call to 'TestFunction<int, double>(Test()::<lambda(int, double)>&)'
TestFunction<int, double>(fce);
//but this works correctly
std::function<void(int, double)> fce2 = fce;
TestFunction<int, double>(fce2);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
main.cpp: In function 'void Test()':
main.cpp:116:31: error: no matching function for …Run Code Online (Sandbox Code Playgroud) 我需要为格式函数vswprintf()分配足够的缓冲区.当用ANSI字符串做同样的事情时,我正在使用:
vsnprintf( NULL, NULL, pszFormat, args );
Run Code Online (Sandbox Code Playgroud)
它返回我所需的缓冲区大小.但似乎这个函数的unicode版本没有这个功能.当我执行:
vswprintf( NULL, NULL, pszFormat, args );
Run Code Online (Sandbox Code Playgroud)
结果值始终为-1.
我发现只有解决方案是使用大型静态缓冲区来计算所需的大小.但我不喜欢这个解决方案:
static const int nBuffSize = 1024;
static XCHAR evalBuff[nBuffSize];
int nSize = vswprintf( evalBuff, nBuffSize, pszFormat, args );
if ( nSize != -1 )
{
return nSize;
}
else
{
throw XXX;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法如何测量unicode字符串所需的缓冲区大小?
关心卢德克
我们正在将我们的 C++ 项目从 VS2013 升级到 VS2017。但是在 VS2017 中,调试版本的链接时间也很糟糕。有了这样的价值观,就不可能进行有效的开发。
当我更改项目中的单个文件时,在 VS2013 中需要 2.6 秒。当我在 VS2017 中对同一个文件做同样的事情时,它需要 30 秒。
VS2013
1> 32 ms ComputeCLOutputs 1 calls
1> 199 ms WarnCompileDuplicatedFilename 1 calls
1> 2688 ms Link 1 calls
1> 4073 ms ClCompile 1 calls
VS2017
1> 31 ms ComputeCLOutputs 1 calls
1> 44 ms CustomBuild 1 calls
1> 239 ms WarnCompileDuplicatedFilename 1 calls
1> 8021 ms ClCompile 1 calls
1> 29725 ms Link 1 calls
Run Code Online (Sandbox Code Playgroud)
这比 VS2013 慢 15 倍以上。
目前,我在我的 PC …
今天我在使用 std::thread 时注意到一个奇怪的想法。这是最小的测试用例:
void test()
{
std::thread t1([] {});
t1.join();
}
Run Code Online (Sandbox Code Playgroud)
每次运行这段代码时,都会有一个 Handle 泄漏。
这是来自 ProcessExplorer 的视图。这些泄漏的句柄是线程互斥锁“BaseNammedObjects\bx_thread_mutex”
这些互斥体在未来任何时候都不会被释放。这是一些知识问题吗?
我正在使用最新的 Visual Studio 2019 16.7.3,我正在 32 位应用程序上测试它(调试和发布也是如此)。
编辑:
泄漏的句柄与执行次数有关,因此此代码段:
for (int n = 0; n < 1000; n++)
{
std::thread t1([] {});
t1.join();
}
Run Code Online (Sandbox Code Playgroud)
我在 Windows 版 Docker 上使用 Linux 容器。
由于在其中一个容器内使用 gcc,我需要为该容器分配超过 4GB 的交换文件。
以前,我使用 swapon 添加更多交换文件,但这停止工作并出现错误:
swapon: failed operation not permitted
我发现的是,不建议将自己的交换文件添加到容器中,而只应使用主机交换文件。
但是,在 Docker for Windows 中,交换文件限制为 4GB,我没有找到增加它的方法:

是否有任何命令行或 Docker-engine json 参数如何将其设置为例如 8GB?
谢谢
When creating QML QQuickItems from c++ code, is it possible to access/modify anchors?
All anchors properties are declared as Q_PRIVATE_PROPERTY in QQuickItem and I don't see any method which could help.
或者我必须anchors通过使用信号/事件来自己实现吗QLayout?
我需要的是例如:
Rectangle {
// ...
anchors.bottom: parent.bottom
anchors.bottomMargin: 0
anchors.top: parent.top
anchors.topMargin: 0
anchors.right: parent.right
anchors.rightMargin: -10
// ...
}
Run Code Online (Sandbox Code Playgroud) 我在yaml-cpp解析器中遇到了问题.当我尝试加载以下定义时:
DsUniversity:
university_typ: {type: enum, values:[Fachhochschule, Universitat, Berufsakademie]}
students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error: yaml-cpp: error at line 2, column 39: end of map flow not found
Run Code Online (Sandbox Code Playgroud)
我试图在http://yaml-online-parser.appspot.com/和http://yamllint.com/上验证yaml的有效性,并且两个服务都报告yaml有效.
问题是由"values:"定义后缺少空格引起的.当yaml更新为以下格式时:
DsUniversity:
university_typ: {type: enum, values: [Fachhochschule, Universitat, Berufsakademie]}
students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.
是否有任何方法如何配置/更新/修复yaml-cpp解析器以继续结肠后缺少空格的yamls?
补充:似乎问题是由空char作为分隔符的要求引起的.当我简化测试片段时
DsUniversity:[Fachhochschule, Universitat, Berufsakademie]
Run Code Online (Sandbox Code Playgroud)
yaml-cpp解析器将其读作标量值"DsUniversity:[Fachhochschule,Universitat,Berufsakademie]".当冒号后添加空char时,yaml-cpp正确加载带序列的元素.
我的Ubuntu 10.10 linux下的unicode函数有问题.许多unicode函数无法正常工作.当我尝试遵循简单的代码时:
#include <wchar.h>
int main(int argc, char *argv[])
{
wprintf(L"test %s %s %s\n",L"one",L"two",L"three");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并使用g ++编译(gcc版本4.4.5 Ubuntu/Linaro 4.4.4.-14ubuntu5)a有以下结果:
test o t t
Run Code Online (Sandbox Code Playgroud)
而不是预期的:
test one two three
Run Code Online (Sandbox Code Playgroud)
使用unicode字符串的其他函数也无法正常工作.我在MS Windows下开发的很多代码,这是我的第一个linux编程尝试.
(在我测试这个片段的两台linux机器上出现相同的bug)
谢谢你的任何建议.