• GDB

    使用gdb之前,要求对文件进行编译时增加-g参数,加了这个参数过后生成的编译文件会大一些,这是因为增加了gdb调试内容 基础指令: -g:使用该参数编译可以执行文件,得到调试表。 gdb ./a.out: 开始调试 list/l: l 1 列出源码, 因为分页显示, 后续直接l即可 b: b 20 在20行位置设置断点。 run/r: 运行程序 n/next: 下一条指令(会越...
  • Vim

  • gcc

    GCC 编译的四个阶段 一个 C 语言源文件要变成可执行文件,需要经过预处理 (Preprocessing)、编译 (Compilation)、汇编 (Assembly) 和 链接 (Linking) 这四个核心步骤。 当你执行一个简单的命令 gcc hello.c -o hello 时,GCC 实际上在后台为你自动完成了所有四个步骤, 分别是: 第一步:预处理 (Prepro...
  • 基本命令与认识Linux

    Linux命令基础习惯 date 显示系统当前时间, 本质是通过shell解释器调用 /bin/date.exe cat /etc/shells 查看当前可使用的shell echo $SHELL 查看当前使用的shell, echo是回声命令, 用于将参数输出到标准输出 键盘快捷键: Ctrl+A 将光标移动到行首 Ctrl+E 将光标移动到行尾 Ctrl+L 清屏 Ctrl+U...
  • 条款34:优先选用 lambda 式,而非 std bind

    在 C++11 中,lambda 表达式几乎总是比 std::bind 更好的选择;到了 C++14,std::bind 基本上已无用武之地。std::bind 是一个源自 C++98 时代函数式编程思想的工具,虽然在 C++11 标准库中被正式引入,但其设计与现代 C++ 的 lambda 表达式相比,在多个方面都相形见绌。 std::bind std::bind 是 C++1...
  • 条款33:对 auto&& 型别的形参使用 decltype, 以 std forward 之

    该条款的核心是解决一个在 C++14 泛型 lambda 中进行完美转发时遇到的具体语法问题。 泛型lambda 简单来说,泛型 Lambda (Generic Lambda) 是一种可以使用 auto 关键字作为参数类型的 Lambda 表达式。这使得该 Lambda 能够接受任意类型的参数,其行为类似于一个函数模板。 在 C++14 之前,如果你想让一个 Lambda ...
  • 条款32:使用初始化捕获将对象移入闭包

    在 C++11 中,lambda 的捕获列表 [] 只能捕获在 lambda 所在作用域内可见的变量,捕获方式只有两种:按值复制或按引用。这导致了一个问题:C++11 无法直接将对象“移动”到闭包中。 这个局限对两类对象影响很大: 只移类型 (Move-only Types):像 std::unique_ptr、std::future 或 std::thread 这样的类型,...
  • 条款31:避免默认捕获模式

    lambda 表达式 Lambda 表达式(Lambda Expression)是一种在需要函数的地方,可以就地定义匿名函数对象的便捷方式。它本质上是一个可调用的代码单元,可以像函数一样使用,但无需为其命名(当然也可以为其命名)。它允许你编写简短、内联的函数,特别适用于作为算法或异步调用的参数,从而让代码更简洁、更具表现力。 为何需要 Lambda? 在 C++11 之前,如果你想向...
  • 条款 28 - 理解引用折叠

    这一条款是对之前条款的理论原理呈现, 揭示了支撑万能引用和 std::forward工作的底层核心机制。这个机制就是引用折叠 (Reference Collapsing, 在之前的条款24中已有介绍) 引用折叠会在四种语境中发生:模板实例化、auto 类型生成、创建和运用 typedef 和别名声明,以及 decltype。 详细内容请参考条款24。
  • 条款 29 - 假定移动操作不存在、成本高、未使用

    该条款旨在为开发者对C++11移动语义的性能预期“降温”,提醒我们移动语义并非万能的性能优化选择。在编写代码时,尤其是在编写通用代码(如模板)时,更安全的做法是假定移动操作可能不存在、可能成本高昂,或者在特定上下文中可能不会被使用。 移动语义是C++11的标志性特性,它允许编译器用成本低廉的移动操作来代替昂贵的复制操作,甚至在某些情况下,只需重新编译C++98的代码就能获得性能提升 。然...
1111213141521