
Visual C++
文章平均质量分 59
金色熊族
这个作者很懒,什么都没留下…
展开
-
理解原子变量之四:可见性、memory_order_acquire与 memory_order_release
则b线程读取该原子变量后,不仅可以看到该原子变量的更新值(也就是a线程写入的值),还能看到a线程对该原子变量进行写入之前的所有其他的写操作的效果,不论是针对该原子变量的,还是针对其他变量的,也不论这些变量是不是原子变量,也不论使用何种内存序。里的实例3里面,我们看到,如果在一个线程里修改原子变量done,另一个线程读取done时,就会看到这个变化。这就是原子变量的可见性。1 a线程对某原子变量进行了写入操作,且使用了内存序memory_order_release,最重要的是红线标出的这句话。原创 2024-11-23 18:51:33 · 469 阅读 · 0 评论 -
理解原子变量之三:原子性与memory_order_relaxed
在一位C++大神 “高效程序员” 的公众号里,有这么一篇文章介绍原子变量《C++11开发中的Atomic原子操作》。里面有这么一段话:“...原子操作,基本都包含...三个方面...的语义:操作本身是不可分割的(Atomicity),一个线程对某个数据的操作何时对另一个线程可见(Visibility),执行的顺序是否可以被重排(Ordering)”。Atomicity翻译过来就是原子性,Visibility翻译过来就是可见性。本文在前面两篇文章的基础上,进一步讲述原子性的含义。原创 2024-11-23 14:55:34 · 363 阅读 · 0 评论 -
理解原子变量之二:从volatile到内存序-进一步的认识
实例1,2,3都是在vs2013下演示的。即使遵循相同的C++标准,不同的编译器对同一个标准的贯彻程度也不一样:有的编译器严格遵循标准,既不多做,也不少做;对照实例1,在不使用volatile的情况下,子线程workerThread对done的修改,没有影响到主线程的while(!编译器意识不到子线程也在改变done的取值,所以就认为done是常量,而不会在运行到while()时读取done的实际值,于是while(!反观实例2和3,子线程修改了done,主线程的运行随之受了影响,这就是可见。原创 2024-11-03 11:30:09 · 1063 阅读 · 0 评论 -
初尝类型萃取--typename、模板偏特化、和traits之(三)类型萃取
本文作者在看过公众号《C++学习与探索》的文章《【一分钟学习C++】萃取机制》后,对类型萃取(type_traits)有了初步的认识,所以写下这篇博客。《【一分钟学习C++】萃取机制》门槛较高,如果没有理解typename和模板偏特化,是难以理解该文意思的。本文以及前面的两篇文章(初尝类型萃取--typename、模板偏特化、和traits之一、二)目的是将萃取涉及的基本知识点,如typename、模板偏特化先讲清楚,然后通过讲解例子的方式,使得类型萃取能被更多读者理解。原创 2024-10-17 20:32:16 · 1082 阅读 · 0 评论 -
初尝类型萃取--typename、模板偏特化、和traits之(二)模板偏特化
这里只讨论类的偏特化。原创 2024-10-16 20:46:03 · 299 阅读 · 0 评论 -
初尝类型萃取--typename、模板偏特化、和traits之(一)typename
此时的typename可以用class代替。原创 2024-10-16 20:32:38 · 346 阅读 · 0 评论 -
冒泡排序的C++语言实现(不用std::sort)
自己写一个冒泡排序的代码。原创 2024-09-17 17:58:07 · 283 阅读 · 0 评论 -
std::bind与std::ref配合使用时要注意的几个问题
在前面的博客,我们看到假如std::bind的输入函数的输入变量是引用类型,则我们可以在std::bind中用std::ref修饰它们。原创 2024-06-23 15:52:46 · 310 阅读 · 0 评论 -
浅析std::ref
根据等消息来源的描述,需要std::ref的场景主要是如下三种:假如std::thread需要调用一个函数,且这个函数的输入参数是引用的话,则std::thread对这个参数的调用必须用ref修饰。假如sid::bind需要调用一个函数,且这个函数的输入参数是引用的话,则std::bind对这个参数的调用必须用ref修饰。stl库调用,比如for_each的输入参数里也可以有一个函数指针。假如这个函数的输入参数是一个引用,则函数指针也要用std::ref修饰。下面通过几个实例来验证以上描述的真伪。原创 2024-06-23 15:31:13 · 1189 阅读 · 0 评论 -
从三个示例看C++中 define...## 的用法
C++中define ...##...的作用是把##两边的内容连接到一起。原创 2024-05-18 17:05:27 · 392 阅读 · 0 评论 -
vs2008使用 openmp
环境windows7 vs2008。原创 2024-04-15 15:09:28 · 401 阅读 · 0 评论 -
理解移动语义(七)--返回值优化
返回值优化原创 2023-04-02 22:45:39 · 945 阅读 · 0 评论 -
理解移动语义(六)--std::forward和std::move
std::forward和std::move原创 2023-04-02 21:30:04 · 162 阅读 · 0 评论 -
理解移动语义(五)--左右值判断的常见错误
c++判断左右值类型遵循这样一条规则:只看调用现场的情况,不看以前的来源原创 2023-04-02 18:09:57 · 240 阅读 · 0 评论 -
理解移动语义(四)--引用折叠
T && 和 auto &&的引用折叠原创 2023-04-02 17:14:52 · 189 阅读 · 0 评论 -
理解移动语义(三)--万能引用
属于和不属于万能引用的情况原创 2023-04-01 15:55:22 · 259 阅读 · 0 评论 -
理解移动语义(二)--延长变量的生命周期
有右值引用,生命周期延长到引用的生命周期结束时原创 2023-04-01 15:13:53 · 450 阅读 · 0 评论 -
理解移动语义(一)左值和右值
左值和右值C++原创 2023-04-01 14:36:20 · 213 阅读 · 0 评论 -
构造函数的调用场景--构造函数与拷贝构造函数、移动构造函数之辨
在Scott Meyers的著作《Effective C++》条款5中,明确指出要“了解C++默默编写并调用哪些函数”。这里通过一个简短的C++代码,阐述哪些场景调用构造函数,哪些场景不调用构造函数。原创 2023-03-27 10:45:06 · 1238 阅读 · 0 评论 -
某车企笔试题解答(2)
某车企笔试题解答(2)原创 2022-11-14 13:16:32 · 566 阅读 · 0 评论 -
windows10安装ninja过程记录
windows10安装ninja过程记录原创 2022-11-03 20:16:11 · 6686 阅读 · 3 评论 -
警惕C/C++同名函数冲突
想象这样一个情景,一个大项目,由两个彼此并不熟悉的企业合作完成。最后的交付软件是一个exe以及两个dll。两个企业各自负责一个dll。巧合的是,两个企业开发时,都依赖同一个第三方库,比如说,是opencv。但是,双方使用opencv的版本不同。由于两个opencv的dll名字不同,所以它们不会覆盖,而是共存(但是它们的头文件都是一样的)。这样带来一种假象,就是dll1和dll2将各自调用各自的opencv库。但事实并非如此。实际上,在链接时,先被链接的dll的函数将覆盖后面的同名函数。目录库原创 2022-05-22 20:55:05 · 1285 阅读 · 0 评论 -
VS2013 + Qt5.7编译ctk源码过程记录
网上介绍如何编译ctk框架的文章很多,大多数主张改ctk的源码,然后编译。我尝试了其中一个比较详细的介绍,发现走到install这一步总是失败。尽管install这一步不是必须的,但是总给人不圆满的感觉。另有一篇文章编译 CTK(Win10 + Qt 5.14.0 + VS2015)_blackwood-cliff的博客-CSDN博客_ctk编译,几乎不改源码,只是用cmake-gui配置一下,然后就能完成包括install在内的所有项目编译。我用vs2013尝试了,可行。这里把我的操作记录一下,并且补原创 2022-05-04 15:00:59 · 2735 阅读 · 0 评论 -
Qt读取xml文件,并写入另一个xml文件的示例
下面的代码利用Qt的QDomDocument等类来读取xml文件exm.xml,并写入另一个文件exm2.xml代码:#include <QDomNode>#include <QDomElement>#include <QDomDocument>#include <QFile>#include <QDebug>#include <QDomProcessingInstruction>int main(int a原创 2022-05-01 14:18:55 · 1088 阅读 · 1 评论 -
利用assimp显示gltf
目录1 编译assimp5.0.12 工程2.1 pro文件:2.2config.h2.3config.h.in中注释掉如下代码:3 运行效果1 编译assimp5.0.1编译过程与我的博客win10操作系统上编译assimp库_liji_digital的博客-CSDN博客描述类似。但是由于assimp5.0.1的版本较高,vs2013编译源码会报错。错误原因是BaseImporter::importerUnits采用了初始化列表赋值,不受2013支持。假如你坚持使用..原创 2022-04-25 22:50:15 · 1660 阅读 · 0 评论 -
static_cast 相比C风格的类型转换,优势何在?
C++提供static_cast以取代c风格的类型转换。其意义在如下几个方面(转自c++ - What is the difference between static_cast<> and C style casting? - Stack Overflow):1 C++编译器在编译阶段就会针对错误的转换报错,而C风格不会。看如下例子1.1 c++风格代码:1.2 C风格类型转换不会报错,于是在运行时引起越界访问:显然,数组c对应的内存0080FA74应存储15 16 两..原创 2022-02-26 13:36:51 · 2163 阅读 · 1 评论 -
记一次调试UDP丢包
问题:在windows平台上开发的程序,UDP发送较频繁(1-2us一包),结果收数据总是有丢失。尽管单独起了一个线程专门收数据,且线程中不使用sleep休眠,避免休眠时错过数据包,但仍然无法避免丢数据。解决方案:windows下默认SO_RCVBUF的缓存是8KB.所以当发来的数据积攒超过8K时,就发生数据丢失。故在建立socket之后调用setsockopt函数,将接收缓存变为充分大的值,比如1M。 m_Socket = socket(AF_INET, SOCK_DGRAM, 0); i原创 2021-11-28 18:15:51 · 2092 阅读 · 2 评论 -
C++格式化数字输入字符串的几个办法
1 最为熟知的就是sprintf了,不多说。2 假如你用Qt的话,还可以用QString::arg()方法3 这里着重讲讲std::stringstream。它是C++17标准引进的。详情可见integer - Convert a number to a string with specified length in C++ - Stack Overflowhttps://stackoverflow.com/questions/225362/convert-a-number-to-a-strin原创 2021-10-16 14:56:09 · 1199 阅读 · 0 评论 -
C++11运行时类型识别(RTTI)示例
示例出处是Michael Wong的著作《深入理解C++11》代码清单4-16,略有改动。#include <iostream>#include <typeinfo>struct white {};struct black {};int main(void){ white a; white c; black b; std::cout << typeid(a).name() << std::endl; std::cout <&l原创 2021-10-16 14:30:23 · 248 阅读 · 0 评论 -
三元运算符(条件运算符)返回左值
三元运算符,或者叫条件运算符(conditional operator),返回的是左值。也就是说,它不仅可以赋值给其他变量,也可以被其他表达式赋值。看下面的例子#include <iostream>int main(void){ int k = 0, l = 1; (4 > 3 ? k : l) = 5;//注意,要加括号,否则l=5将率先结合在一起 std::cout << "k = " << k << ",l = " <<原创 2021-10-16 13:58:12 · 632 阅读 · 0 评论 -
澄清对于c++析构函数的误解
以前一直以为析构函数也存在继承。但是今天看了stackoverflow和微软官网的描述后,发现自己错了:随之而来的一个问题是,既然析构函数不能继承,为什么多态里面总是强调基类的析构函数应该是virtual的?cppreferencevirtual 函数说明符 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/virtual上有一段解释回答了这个问题:虽然析构函数不存在虚继承,但是派生类还是覆盖了基类的虚析构函数。..原创 2021-10-07 19:58:27 · 245 阅读 · 1 评论 -
探讨侯捷老师关于variadic template讲义的一处表述
最近在学习侯捷老师的c++视频。其中关于variadic template的讲义25:00处的一处讲述似乎不对,特地拿出来与大家探讨。视频源https://www.youtube.com/watch?v=TJIb9TGfDIw&list=WL&index=4&t=1414shttps://www.youtube.com/watch?v=TJIb9TGfDIw&list=WL&index=4&t=1414s在第25分钟处,侯老师说,当args...有零个参数原创 2021-10-05 16:58:22 · 158 阅读 · 0 评论 -
VS2019 编译+调试 Bullet
本文受了 Create C++ cross-platform projects in Visual Studio | Microsoft DocsHow to set up, compile, and debug a C++ open-source CMake project in Visual Studio that targets both Linux and Windows.https://docs.microsoft.com/en-us/cpp/build/get-started-linux-cma原创 2021-09-19 11:54:02 · 1098 阅读 · 0 评论 -
c/c++的逗号操作符
逗号操作符的优先级是最低的(https://zh.wikipedia.org/wiki/%E9%80%97%E5%8F%B7%E8%BF%90%E7%AE%97%E7%AC%A6)。它的形式是expression1, expression2。它首先计算expression1,然后计算expression2。而且将expression2的结果作为返回值。...原创 2021-08-22 10:37:17 · 100 阅读 · 0 评论 -
C++实现YUV转RGBA
本文受了https://blog.csdn.net/fanyun_01/article/details/100068351 的启发。但是该文章有一处谬误:YUV420的内存排列不是按照下图所示的。正确的排列应如下(来源维基百科yuv条目):根据正确的内存排列,写出相应的代码:YUV2RGB.h#pragma once#include <qglobal.h>void vFillY_U_V_Buff(const quint32 & ui32Width, con原创 2021-04-20 20:06:04 · 1067 阅读 · 0 评论 -
读取多波段的tif(利用GDAL)
bmp的格式是RGBRGB.....排列下来的,每个像素的三个分量靠在一起,描述完一个像素,接着描述下一个像素。tif的格式更多样。通常的格式也是BGRBGR.....(次序与bmp相反)排列下来的,但偶尔有一些tif文件采用RRRRRR.......GGGGG.........BBBBB.....的安排。还有的tif文件内容是压缩过的。。。。这里我们只考虑三个颜色分量靠在一起的情况。下面的例子是一个tif文件,宽896,高608,三个分量。这里先把其内容取出,并交换RB的位置,然后保存为.rgb文原创 2021-04-10 13:55:42 · 2829 阅读 · 0 评论 -
一个tif转bmp的示例
本文受了https://blog.csdn.net/m0_46340275/article/details/105476139 的启发。bmp的格式是RGBRGB.....排列下来的,每个像素的三个分量靠在一起,描述完一个像素,接着描述下一个像素。tif的格式更多样。通常的格式也是BGRBGR.....(次序与bmp相反)排列下来的,但偶尔有一些tif文件采用RRRRRR.......GGGGG.........BBBBB.....的安排。还有的tif文件内容是压缩过的。。。。这里我们只考虑三个颜色原创 2021-03-15 20:20:04 · 1362 阅读 · 0 评论 -
std::vector内存结构简析
在CppCon 2019的演讲(https://www.youtube.com/watch?v=St0MNEU5b0o&t=2171s 3分48秒)中,Klaus Iglberger给出了std::vector的内存结构:vector的内容其实是3个指针构成的。第一个指针是首元素的地址,第二个指针是最后一个元素的地址,第三指针是vector::capacity的最后一个元素的地址。假如vector内容为空,则三个指针的内容均为0(nullptr)下面对其进行验证:...原创 2021-02-09 09:25:58 · 3239 阅读 · 0 评论 -
C++ primer plus第8.2.4的一处错误
《C++ primer plus》第六版中文版的268页有一处错误:声称上面的函数clone()隐藏了对new的调用。这是错误的。因为pt此时是未分配内存的。下面的代码也印证了这个分析:最后,奉上百度文库的勘误表:...原创 2021-02-08 10:41:20 · 489 阅读 · 4 评论 -
如何创建并使用unique_ptr 实例(译文)
译自https://docs.microsoft.com/en-us/cpp/cpp/how-to-create-and-use-unique-ptr-instances?view=msvc-160总述Aunique_ptrdoes not share its pointer. It cannot be copied to anotherunique_ptr, passed by value to a function, or used in any C++ Standard Libra...翻译 2021-01-10 16:13:27 · 684 阅读 · 0 评论