
C++ 深入理解与应用
文章平均质量分 56
mightbxg
这个作者很懒,什么都没留下…
展开
-
圆整 round 的一点点小细节
圆整就是获得一个浮点数最接近的整数,所谓的“四舍五入”便是指的圆整。C++ 中可以调用 std::round 来实现。看起来很简单的操作是吧,其实里面有一些小细节的。std::round 不能在编译期间计算编译期(compile-time)计算和运行期(run-time)计算的概念想必大家都懂,如果一个函数能够在编译期间就计算得到结果(这样的函数叫做常量表达式函数 constexpr funciton),那就能够节省运行期的计算时间。某些情况下必须要求在编译期计算,比如模板参数:template &l原创 2021-03-31 20:48:47 · 2098 阅读 · 0 评论 -
GDB 简略手册
杂项命令用法说明h[elp]help显示可用帮助文档h CMD显示关于指定命令的帮助apr[opos]apr REGEXP使用正则表达式搜索命令i[nfo]info显示可展示的信息ENTER无命令回车重复执行上一次命令断点命令用法说明info breaki b显示全部断点和检查点信息info watchi wat显示全部检查点信息b[reak]break在当前位置添加断点b N原创 2022-05-15 15:35:06 · 452 阅读 · 0 评论 -
【C++】头文件声明变量总结
类外变量// 1. 直接声明定义// 如果被多个 cpp 包含,则链接报错 (multiple definition)// int a = 0;// 2. static// 内部链接 (internal linkage),即每个包含本头文件的翻译单元都有一个单独的实例,互不影响static int a_static { 0 };// 3. const// 内部链接,并且无法修改const int a_const { 0 };// 4. extern// 外原创 2022-04-22 17:12:46 · 2118 阅读 · 0 评论 -
【C++】emplace_back vs push_back
C++11 引入了 vector::emplace_back(),此前 vector 只能调用 push_back 来添加元素。一个简单的示例来对比两者区别:#include <iostream>#include <vector>using namespace std;struct A { A() { cout << "Default constructor: " << val << endl; } A(int v) :原创 2022-03-29 19:49:48 · 1162 阅读 · 0 评论 -
【C++】如何强制指定函数的优化等级
在比较大的 C++ 工程中,为了提高程序执行效率,往往会使用 O2 或 O3 优化等级进行编译。同时为了调试程序,可以加入 “-g” 选项来保留 debug 符号。不过很多时候 O2/O3 优化会导致编译结果与源代码的结构差异很大,比如循环展开和指令集优化可能导致循环消失,函数内联导致无法跳转等,给 debug 过程带来很多麻烦。为此可以强制指定被调试的函数优化等级为 O0,不对整体程序性能产生太大影响的同时,使调试更加方便。对于 GCC 而言,有三种方法能指定函数优化等级:预处理器#pragma原创 2022-02-17 12:42:09 · 1631 阅读 · 0 评论 -
带默认模板实参的类模板与模板模板形参的匹配
首先解释一下这个看起来很奇怪的标题。“带默认模板参数的类模板”是指 Class template with default template-argument,即一个类模板的部分或全部模板参数有默认类型,比如:template<typename T1, typename T2 = int>struct Foo { };有个很典型的例子是 std::vector,它其实有两个模板参数:template<class T, class Allocator = std::allocat原创 2021-07-27 11:01:12 · 2039 阅读 · 0 评论 -
C++ 函数中获取输入的静态数组长度
假设有这么一种情况:程序中定义了一个静态数组,然后将这个数组作为参数传递给某个函数,如何在该函数中确定数组长度呢?int arr[] = { 1, 2, 3, 4, 5 };f(arr); // 如何在函数 f() 中确定 arr 的长度?C 语言中遇到这种情况,一般是直接将数组长度作为参数传递给 f():void f(int *arr, int n) {}int arr[] = { 1, 2, 3, 4, 5 };f(arr, 5);如果 arr 是动态数组,在 C++ 中确实也只能这原创 2021-03-02 20:59:48 · 752 阅读 · 0 评论 -
SSE学习-一个小栗子
指令集优化在高性能计算中至关重要,所以用 C/C++ 到后面感觉难免要用上指令集。虽然指令集学习和使用都不太容易,但想一想能够在不增加 CPU 占用的情况下提升数倍计算速度,确实挺诱人的。具体指令集是啥就不多介绍了,几个名词:SIMD: 单指令多数据,即指令集加速技术SSE: Streaming SIMD Extensions, 使用128位寄存器的指令集(Intel)AVX: Advanced Vector Extensions, 使用256位寄存器的指令集(Intel)Neon: ARM 上原创 2020-10-16 12:28:42 · 1204 阅读 · 0 评论 -
利用 CPU 流水线加快数据处理
最近看 OpenCV 源码时注意到一个有意思的地方:template<typename T, size_t BinsOnStack = 0u>static double getThreshVal_Otsu( const Mat& _src, const Size& size){ const int N = std::numeric_limits<T>::max() + 1; int i, j; #if CV_ENABLE_UNROLLED原创 2020-09-24 18:10:44 · 833 阅读 · 0 评论 -
你自己的 error_code
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言问题前言最近我在用std::error_code给自己的应用实现“错误状态分类”功能,这里分享一下我的一些经验和见解。C++11 提供了一个非常精妙的错误状态分类机制,你也许已经见过一些相关的名词,比如“error code”、“error condition”、“e翻译 2020-09-15 22:20:47 · 5508 阅读 · 2 评论 -
C++判断一个类是否继承自另一个类
文章目录前言std::is_base_of基类带模板的情况前言派生类会继承基类的接口,所以我们经常会把一个基类派生出的多个派生类当作同一个类别。在某些函数或者类中,我们可能希望只支持某一类别的输入,即只支持某个类型或者这个类型的派生类,此时就需要判断输入类型是否继承自目标类型。考虑这样一种情形:线条(Line)由一系列点构成,而“点”可以有多种类型:圆点(Dot)、星点(Star)…,另外还有一种类型“平面”(Plane)则不是一种“点”,它们定义如下:class Point { };class原创 2020-09-03 16:14:33 · 9604 阅读 · 0 评论