
C++
文章平均质量分 70
nwao7890
这个作者很懒,什么都没留下…
展开
-
VS各版本VC各版本对应关系
Visual Studio 经过多年的发展,有许多版本,经常我们在拿到一份代码时不知道对应的VS版本。你拿到的代码里没有vcproj文件 只有dsw文件?快去使用经典的vc6吧。其中的ToolsVersion代表了VC的版本,对照下表便可知对应的VS版本。这时候可以打开工程目录下的vcproj/vcxproj文件,如下所示。原创 2023-02-13 14:19:32 · 1557 阅读 · 0 评论 -
让性能提高5倍的多线程读写变量优化
了解CPU缓存cache line,帮助我们优化多线程程序开发原创 2022-10-23 23:36:37 · 548 阅读 · 0 评论 -
扁平数组转树结构C++实现方式
扁平数组转树结构 使用c++语言实现一下。原创 2022-07-29 01:26:43 · 490 阅读 · 0 评论 -
C++内存布局
C++内存布局中,堆和栈在内存中的关系是怎样的,堆相对栈总是处于低地址区吗?windows linux上布局一样吗?原创 2022-04-20 20:44:38 · 2080 阅读 · 0 评论 -
通过汇编分析数组名与指向数组的指针
数组名就是指向数组的指针吗?那它跟指向数组的指针用起来一样吗?通过汇编来分析原创 2022-03-11 11:16:44 · 875 阅读 · 0 评论 -
c99与c++98的一些不兼容之处
c++真的只是增加了类的c吗?原来c99与c++98的不同点有这么多,一起来学习一下吧翻译 2021-06-17 16:34:08 · 1485 阅读 · 0 评论 -
自定义buffer遇到的memcpy之坑
memcpy 使用不当会导致 拷贝完成后有数据丢失哦,如果发生了此问题该怎么办呢?原创 2021-05-17 13:41:15 · 1568 阅读 · 0 评论 -
C++对象模型-构造函数语义学 第二章笔记
C++默认构造函数会在需要的时候被产生出来,且只在编译器需要的时候才合成。且合成出来只执行编译器需要的行动。即使合成了默认构造函数,也不会将成员变量初始化为0,若要如此需要程序员提供明显的默认构造函数。编译器默认构造函数在如下4种情况会合成出来(nontrival default constructor)成员函数带有默认构造函数,则此class的implicit default constructor就是nontrivial。在构造函数真正需要调用时才会合成默认构造函数...原创 2020-06-27 22:59:41 · 190 阅读 · 0 评论 -
C++对象模型-Data语义学 第三章笔记
class A; class B:public virtual A; class C: public virtual A; class D: public B,public C此种情况下一般 A的大小为1,sizeof(B)=sizeof©=8;因为B,C中包含指向虚基类的一个指针。sizeof(D)为12,因为A中一字节+B中一个指针+C中一个指针=9,由于需要内存对齐的原因会padding至12。若编译器处理了empty virtual base class 则A中不会有1字节的插入占位。上述计算就会原创 2020-06-29 00:53:32 · 198 阅读 · 0 评论 -
C++对象模型-Function语义学 第四章笔记
member的各种调用方式nonstatic member function,编译器会在函数参数中插入一个this,这样成员函数就转化成普通函数的调用。编译器还会进行命名修饰name mangling,根据成员函数名、参数类型等信息产生一个唯一的函数名字以确保无重复。virtual member function虚拟成员函数编译器会将pt->func()转化为通过虚函数表来调用的形式(*pt->vptr[1])(ptr)。//1是函数在vtbl中的序号,(ptr)是this指针ob原创 2020-06-30 08:32:57 · 175 阅读 · 0 评论 -
C++对象模型-构造拷贝解析语义学 第五章笔记
纯虚基类中若有成员,则需要提供带参数的构造函数,以便子类调用初始化C++纯虚函数可以被静态调用,如Abstract_base::interface() 。而pure virtual destructor必须定义,编译器会为每一个子类扩展其析构函数,以静态调用的方式调用其每个vritual base class及上一层class的析构。通常vritual destructor不要声明为pure如果成员函数在子类中不会被改写,最好不要声明为virtual,不能信赖编译器优化把非必要的虚函数转化为静态调.原创 2020-07-05 22:39:52 · 217 阅读 · 0 评论 -
C++对象模型-执行期语义学 第六章笔记
对象的构造和析构一般我们尽量把obj放在使用它的地方附近,以节省不必要的对象产生和销毁。全局对象,最好不要用需要静态初始化的全局变量。其需要编译器处理何时构造何时析构,实现并不统一。局部静态对象,目前要求其在需要时才创造出来,至于何时销毁,编译器需要自行维护所有静态对象的一个执行期链表。对象数组,若无构造析构,则仅分配内存,否则编译器会用构造和析构每个元素。new 和deletenew 先分配内存,再初始化delete不会对指针值为0的情况做任何操作,delete 0是可以的。但dele原创 2020-07-06 00:23:22 · 193 阅读 · 0 评论 -
C++对象模型-在对象模型的尖端 第七章笔记
template编译器看到template class声明时什么也不会做。必须经过具现后才能使用其中变量。若声明一个template class具现类型的指针后,也是什么也没有。因为指针不需要触发对象的具现。如果一个virtual function 被具现出一其具现点紧跟在其class具现点之后异常处理throw语句会抛出内建类型或自定义类型的异常catch子句用于处理某种类型的异常,在大括号中提供处理程序try子句包含着可能抛异常的代码异常触发后,控制权会从函数调用中被原创 2020-07-06 01:12:43 · 229 阅读 · 0 评论 -
C++对象模型-关于对象 第一章笔记
c++增加封半夜生并未增加对象布局开销.在virtual function ,virtual base class情况下会给c++带来内存(虚函数表)开销,运行时负担.c++含两种成员静态与非静态,三种权限public private protectc++对象模型原创 2020-06-25 12:10:58 · 164 阅读 · 0 评论 -
Effective C++读书笔记
item1 尽量以const和inline取代#define#define double PI = 3.14 => const double PI=3.14 .h class xxx{ static const int NUM = 5;} .cpp const int xxx::NUM;#define 函数时, 每一个部分都要加(),不如使用inline + template来替换item2 尽量以iostream取代stdio.h#include <cstdi原创 2020-07-13 19:39:04 · 275 阅读 · 0 评论