浏览文章

C++

7 项

C++内存问题排错小工具

在 C++ 开发中,使用 -fsanitize=address 编译器标志启用了 AddressSanitizer,这是一个功能强大的内存错误检测工具,用于检测各种内存相关的错误,包括但不限于内存泄漏、越界访问和使用后释放。这个工具是为了帮助开发者在开发阶段发现潜在的错误,以增强程序的稳定性和安全性。 …

继续阅读

C++程序内存泄露工具

在使用 gperftools 的 heap profiler 分析 C++ 程序的内存使用情况时,您可以生成多个内存分配描述文件(heap profiles),这些文件记录了程序在特定时间点的内存分配状态。通过对比这些描述文件(即进行 “diff” 操作),可以发现在两个时间点之间的内存分配差异。 具体来说,pprof …

继续阅读

C++11 lambda

Introduction C ++ 11引入了lambda,该lambda提供了一种语法上轻量级的方式来动态定义函数。它们还可以通过值或引用来捕获(或封闭)周围范围的变量。在本文中,我们将研究lambda与纯函数和函子类(实现的类)在实现方面的区别operator()。 Capture By Value class …

继续阅读

C++ 11 Atomic

引入的原子指令 SSE2 extensions introduce two new fence instructions (LFENCE and MFENCE) as companions to the SFENCE instruction introduced with SSE extensions. The …

继续阅读

理解右值引用

一句话概述 std::move本身只做类型转换,对性能无影响。 我们可以在自己的类中实现移动语义,避免深拷贝,充分利用右值引用和std::move的语言特性。 移动语义目的就是用浅拷贝代替深拷贝,右值引用跟深拷贝放到同一场景才是有意义的。 实现移动语义 在没有右值引用之前,一个简单的数组类通常实现如下,有构造函数、拷贝 …

继续阅读

c++虚函数表

概述 首先,相较于C语言,C++语言并没有额外增加内存消耗(确切说,在没有虚函数情况下)。 对于一个C++类对象,每个对象有独立的数据成员(非static),但是内存中成员函数只有一份,该类的所有对象共享成员函数。 编译器在编译阶段,进行函数的重构,即将成员函数进行非成员化。通过将this指针作为函数的第一个参数,通过 …

继续阅读

std::shared_ptr

shared_ptr template< class T > class shared_ptr; (C++11 起) 多个shared_ptr管理同一个指针,仅当最后一个shared_ptr析构时,指针才被delete。这是怎么实现的呢?答案是:引用计数(reference counting)。引用计数指的 …

继续阅读