Luyoung
  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
C++调试:函数调用过程和堆栈

C++调试:函数调用过程和堆栈

正文本文会讨论C++中函数的调用过程,以及堆栈、栈帧等调试信息。平台以及工具为 Apple Silicon M1 + lldb。 这将会从这个例子开始: 12345678910111213141516171819202122232425262728293031#include <stdio.h>#include <stdlib.h>#include <sys/ty
2024-05-17
经验方法 > C++
#c++
C++调试:内存管理

C++调试:内存管理

正文本文将会通过一个例子,通过 nm、lldb 工具查看 ELF 文件的内存管理: 123456789101112131415161718192021#include <iostream>using namespace std;/*说明:C++中不再区分初始化和未初始化的全局变量、静态变量的存储区,如果非要区分下述程序标注在了括号中*/int g_var = 0; // g_var
2024-05-16
经验方法 > C++
#c++ #lldb
C++并发:构建线程安全的队列

C++并发:构建线程安全的队列

正文线程安全队列的完整的类定义,其中采用了条件变量: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <condition_variable>#include <memory>#include <
2024-05-15
C++
#c++
C++并发:等待条件成立

C++并发:等待条件成立

一、用std::condition_variable等待处理数据伪代码如下: 123456789101112131415161718192021222324252627282930std::mutex mut;std::queue<data_chunk> data_queue; ⇽--- ①std::condition_variable data_cond;void dat
2024-05-15
C++
#c++
C++:并发保护

C++:并发保护

一、前言本文将会通过保护一个数据讨论:互斥锁、双重检查锁、 std::once_flag 类、 std::call_once() 函数、单例模式、使用局部静态变量实现单例模式等。 二、保护共享数据假设我们需要某个共享数据,而它创建起来开销不菲。因为创建它可能需要建立数据库连接或分配大量内存,所以等到必要时才真正着手创建。这种方式称为延迟初始化(lazy initialization),常见于
2024-05-14
C++
#c++
C++并发:锁

C++并发:锁

一、前言C++中的锁和同步原语的多样化选择使得程序员可以根据具体的线程和数据保护需求来选择最合适的工具。这些工具的正确使用可以大大提高程序的稳定性和性能,本文讨论了部分锁。 二、std::lock在C++中,std::lock 是一个用于一次性锁定两个或多个互斥量(mutexes)的函数,而且还保证不会发生死锁。这是通过采用一种称为“死锁避免算法”的技术来实现的,该技术能够保证多个互斥量按照一
2024-05-14
C++
#c++
C++:完美转发(二)(std::forward)

C++:完美转发(二)(std::forward)

一、RVO优化和std::move、std::forward以下是一个综合性的例子: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
2024-05-12
C++
#c++
C++:完美转发(一)(std::forward)

C++:完美转发(一)(std::forward)

一、理解引用折叠(一)引用折叠  1. 在C++中,“引用的引用”是非法的。像 auto& &rx = x;(注意两个&之间有空格)这种直接定义引用的引用是不合法的,但是编译器在通过类型别名或模板参数推导等语境中,会间接定义出“引用的引用”,这时引用会形成“折叠”。   2. 引用折叠会发生在模板实例化、auto类型推导、创建和运用typedef和别名声明、以及decl
2024-05-12
C++
#c++
C++:移动语义(std::move)

C++:移动语义(std::move)

一、std::move(一)std::move 的原型123456 template<typename T> decltype(auto) move(T&& param) //注意,形参是个引用(万能引用){ using ReturnType = typename remove_reference<T>::type&&a
2024-05-11
C++
#c++
C++:左值(引用)&右值(引用)

C++:左值(引用)&右值(引用)

〇、前言本文会讨论C++中的左值,右值,左值引用,右值引用,以及会理清它们之间的关系。 一、左值与右值(一)概述  1. 左值是一般指表达式结束后依然存在的持久化对象。右值指表达式结束时就不再存在的临时对象。便捷的判断方法:能对表达式取地址、有名字的对象为左值。反之,不能取地址、匿名的对象为右值。   2. C++ 表达式(运算符带上其操作数、字面量、变量名等)有两种独立的属性:类型和值类别
2024-05-10
C++
#c++
1…1011121314…23

搜索

Hexo Fluid
总访问量 次 总访客数 人