C++17 详解 1

本文为 《C++17 in detail》 一书的中文渣中渣译文,不足之处还望指正。

第一部分——语言特性

C++17 是对 C++ 的一次重大更新,引入了大量语言特性。大多数新增特性让 C++ 更简洁更直截了当。

在本部分你将学到:

  • 被移除和被标记为已弃用的特性
  • C++ 是如何变得更精准的:比如,借助表达式求值顺序保证
  • 模版相关新特性:比如 if constexpr、折叠表达式(fold expressions
  • 新的标准属性(attributes
  • 如何借助结构化绑定(structured binding)、内联变量(inline variables)、编译时 if 和类模版参数推导(template argument deduction for classes)写出更简洁更具表现力的代码
阅读更多

AVX2 优化 C++ 混响算法

这里 是一份 C++ 混响算法的实现,修正掉索引下溢 BUG 后大概是这样:

1
2
3
4
5
6
7
8
9
size_t samples = file.file_size / 4;
size_t ir_samples = sizeof(ir) / 4;
for (size_t i = 0; i < samples; ++i)
{
for (size_t j = 0; j < ir_samples && i >= j; ++j)
{
file.out_file_data[i] += file.in_file_data[i - j] * ir[j];
}
}

在我的 Intel i7-7700 4 核机器上,混响一段 60s、单声道、float 采样的 pcm 音频需要 12452 ms 的时间。

阅读更多

C++17 并行算法探究

C++17 终于把并行计算引入到了 STL,且更新成本极低,只是把 大多数迭代算法函数 多加了一个并行版本的重载,实现了并行、并发两个维度上的性能优化。

比如,对一组数据做一个加倍的 transform:

  • 串行版本,同以前:
    1
    std::transform(std::execution::seq, iter_begin, iter_end, output_iter, [](int val) { return val * 2; });
阅读更多

C++17 几个新的语言特性

1. 结构化绑定声明

绑定指定名称到初始化器的子对象或元素。 通俗地讲,对形如 std::pairstd::tuple 或自定义聚合类型的实例,可以声明一组变量直接指向其成员,无需创建一个对应聚合类型的临时变量:

1
2
3
4
std::pair<int, int> point{ 0, 1 };
// some operations around point
// ...
auto [x, y] = point; // x equals to point.first; y equals to point.second
阅读更多

VS2019 编译 QtPropertyBrowser 源码

尝试在 VS 2019 中导入 QtPropertyBrowser 源码到 VS 工程(vcxproj)进行编译时,遇到如下编译错误:

1
2
3
4
5
6
7
1>moc_qtpropertybrowser.cpp
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\x64\Debug\moc\moc_qtbuttonpropertybrowser.cpp(94,29): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate”
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\qtpropertybrowser\qtbuttonpropertybrowser.h(47): message : 参见“QtButtonPropertyBrowserPrivate”的声明
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\x64\Debug\moc\moc_qtbuttonpropertybrowser.cpp(95,29): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate”
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\qtpropertybrowser\qtbuttonpropertybrowser.h(47): message : 参见“QtButtonPropertyBrowserPrivate”的声明
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\x64\Debug\moc\moc_qtbuttonpropertybrowser.cpp(96,29): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate”
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\qtpropertybrowser\qtbuttonpropertybrowser.h(47): message : 参见“QtButtonPropertyBrowserPrivate”的声明

解决办法如下:

在 VS 项目目录内右键对应 moc 文件的头文件,选中属性—Qt Meta-Object Compiler—moc,将 C++ Dynamic Source 值从 “Output File” 改为 “Disable”,重新编译即可。

简言之,这个项的作用是将当前文件中 Qt 类生成的 moc 源文件在编译阶段动态添加到编译器的源码文件列表中。 因为 Private 类的定义在 x.cpp 文件而非 x.h 中,导致编译 moc_x.cpp 时找不到类定义。

项值 Disable 即不将 moc_x.cpp 动态添加到编译器中。这么做是没问题的,因为 QtPropertyBrowser 相关源文件的最后都已显式 include 了对应的 moc.cpp。

具体可参考:

https://forum.qt.io/topic/119401/how-to-compile-source-code-of-qtpropertybrowser-by-vs2019-correctly

https://www.qt.io/blog/2018/01/24/qt-visual-studio-new-approach-based-msbuild