使用gdb之前,要求对文件进行编译时增加-g参数,加了这个参数过后生成的编译文件会大一些,这是因为增加了gdb调试内容
基础指令:
-g:使用该参数编译可以执行文件,得到调试表。
gdb ./a.out: 开始调试
list/l: l 1 列出源码, 因为分页显示, 后续直接l即可
b: b 20 在20行位置设置断点。
run/r: 运行程序
n/next: 下一条指令(会越...
GCC 编译的四个阶段
一个 C 语言源文件要变成可执行文件,需要经过预处理
(Preprocessing)、编译
(Compilation)、汇编 (Assembly) 和 链接
(Linking) 这四个核心步骤。
当你执行一个简单的命令 gcc hello.c -o hello 时,GCC
实际上在后台为你自动完成了所有四个步骤, 分别是:
第一步:预处理 (Prepro...
Linux命令基础习惯
date 显示系统当前时间, 本质是通过shell解释器调用 /bin/date.exe cat
/etc/shells 查看当前可使用的shell echo $SHELL 查看当前使用的shell,
echo是回声命令, 用于将参数输出到标准输出
键盘快捷键: Ctrl+A 将光标移动到行首 Ctrl+E 将光标移动到行尾 Ctrl+L
清屏 Ctrl+U...
在 C++11 中,lambda 表达式几乎总是比 std::bind 更好的选择;到了
C++14,std::bind 基本上已无用武之地。std::bind 是一个源自 C++98
时代函数式编程思想的工具,虽然在 C++11
标准库中被正式引入,但其设计与现代 C++ 的 lambda
表达式相比,在多个方面都相形见绌。
std::bind
std::bind 是 C++1...
该条款的核心是解决一个在 C++14 泛型 lambda
中进行完美转发时遇到的具体语法问题。
泛型lambda
简单来说,泛型 Lambda (Generic Lambda) 是一种可以使用 auto
关键字作为参数类型的 Lambda 表达式。这使得该 Lambda
能够接受任意类型的参数,其行为类似于一个函数模板。
在 C++14 之前,如果你想让一个 Lambda
...
在 C++11 中,lambda 的捕获列表 [] 只能捕获在 lambda
所在作用域内可见的变量,捕获方式只有两种:按值复制或按引用。这导致了一个问题:C++11
无法直接将对象“移动”到闭包中。
这个局限对两类对象影响很大:
只移类型 (Move-only Types):像
std::unique_ptr、std::future 或 std::thread
这样的类型,...
lambda 表达式
Lambda 表达式(Lambda
Expression)是一种在需要函数的地方,可以就地定义匿名函数对象的便捷方式。它本质上是一个可调用的代码单元,可以像函数一样使用,但无需为其命名(当然也可以为其命名)。它允许你编写简短、内联的函数,特别适用于作为算法或异步调用的参数,从而让代码更简洁、更具表现力。
为何需要 Lambda?
在 C++11 之前,如果你想向...
这一条款是对之前条款的理论原理呈现, 揭示了支撑万能引用和
std::forward工作的底层核心机制。这个机制就是引用折叠
(Reference Collapsing, 在之前的条款24中已有介绍)
引用折叠会在四种语境中发生:模板实例化、auto 类型生成、创建和运用
typedef 和别名声明,以及 decltype。
详细内容请参考条款24。
该条款旨在为开发者对C++11移动语义的性能预期“降温”,提醒我们移动语义并非万能的性能优化选择。在编写代码时,尤其是在编写通用代码(如模板)时,更安全的做法是假定移动操作可能不存在、可能成本高昂,或者在特定上下文中可能不会被使用。
移动语义是C++11的标志性特性,它允许编译器用成本低廉的移动操作来代替昂贵的复制操作,甚至在某些情况下,只需重新编译C++98的代码就能获得性能提升
。然...