小编Lud*_*cka的帖子

如何加快c ++链接时间

有没有办法,在MS Visual Studio C++(2005)中优化链接时间?我们正在使用Xoreax Incredibuild进行编译加速,但没有任何链接.

目前,每个链接大约需要30秒.当我打开增量链接时,需要35-40秒.(无论我是否使用incredibuild编译项目)

有什么办法,如何配置链接器并观察需要多长时间?或者任何用于paralel链接的工具?或任何代码优化的提示,以加快链接器?

感谢Ludek Vodicka的回复


编辑:

感谢您的第一次回复和其他信息:

  • 整个程序优化和链接时代码生成已经关闭.
  • 已尽可能使用PIMPL习语
  • 其他静态库已经通过#pragma comment(lib,"pathToLib")包含在内.(也因为更容易维护]
  • 硬件:四核q6600,8GB内存,3x WD猛禽raid 0. Windows Vista 64bit

c++ linker visual-c++

16
推荐指数
2
解决办法
2万
查看次数

boost :: MPL和boost :: fusion之间的区别

我是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和融合之间有什么区别吗?是否存在一个库优先于另一个库的情况?

谢谢你的答复.

boost boost-fusion boost-mpl

10
推荐指数
1
解决办法
2109
查看次数

如何创建用于QML的通用对象模型?

我想知道是否有任何宏或方式如何将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属性.

(我知道有QQmlListPropertyQQmlListProperty不支持部分刷新.总是需要重建所有Qml对象)

c++ generics qt model qtquick2

7
推荐指数
1
解决办法
3228
查看次数

错误“lambda 不是从‘std::function’派生的”

我正在尝试将 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)

c++ lambda templates function

6
推荐指数
1
解决办法
609
查看次数

如何在Linux gcc下确定vswprintf的缓冲区大小

我需要为格式函数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++ unicode gcc

5
推荐指数
1
解决办法
1674
查看次数

VS2017 C++ 链接器速度非常慢

我们正在将我们的 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 …

c++ performance linker visual-studio visual-studio-2017

5
推荐指数
0
解决办法
2299
查看次数

处理 std::thread c++ 中的泄漏

今天我在使用 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)

创建 1000 个泄漏的句柄: 在此处输入图片说明

multithreading handle visual-c++

5
推荐指数
1
解决办法
117
查看次数

如何增加 Windows 版 Docker 上的交换大小

我在 Windows 版 Docker 上使用 Linux 容器。

由于在其中一个容器内使用 gcc,我需要为该容器分配超过 4GB 的交换文件。

以前,我使用 swapon 添加更多交换文件,但这停止工作并出现错误:

swapon: failed operation not permitted

我发现的是,不建议将自己的交换文件添加到容器中,而只应使用主机交换文件。

但是,在 Docker for Windows 中,交换文件限制为 4GB,我没有找到增加它的方法:

https://i.ibb.co/pdTPdFt/Docker-Desktop-2020-02-20-18-21-07.png

是否有任何命令行或 Docker-engine json 参数如何将其设置为例如 8GB?

谢谢

memory swap docker

4
推荐指数
1
解决办法
6202
查看次数

Is it possible to access QML anchors from C++?

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)

qml qt5 qtquick2

3
推荐指数
1
解决办法
2751
查看次数

Yaml-cpp解析不起作用冒号后空格丢失

我在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正确加载带序列的元素.

c++ parsing yaml yaml-cpp

2
推荐指数
1
解决办法
3445
查看次数

linux g ++的Unicode问题

我的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)

谢谢你的任何建议.

c++ unicode gcc

1
推荐指数
1
解决办法
948
查看次数