本文参考System V ABI: AMD64 Architecture Processor Supplement,并且不考虑__float128
,__m128
,__m256
和__m512
等类型的参数的传递和作为返回值的情况。
主要内容:
- 函数调用相关的常用寄存器
- 函数调用时的stack frame:可省略的
%rbp
和red-zone - 函数调用时参数的传递:参数分类,不同类型参数的传递方式
- 函数返回值的处理
本文参考System V ABI: AMD64 Architecture Processor Supplement,并且不考虑__float128
,__m128
,__m256
和__m512
等类型的参数的传递和作为返回值的情况。
主要内容:
%rbp
和red-zoneSingleton是GoF Design Patterns中提及的面向对象的23种设计模式之一,书中关于Singleton的定义如下
Ensure a class only has one instance, and provide a global point of access to it
实践中,一般Singleton被认为是:
本文解决以下问题:
Linux 的等待队列(wait queue)是实现 阻塞 I/O 和 I/O复用 (select, poll, epoll 等)的关键同步原语。
本文基于Linux 5.7,主要介绍:
wait_queue_head
: DECLARE_WAIT_QUEUE_HEAD
, init_wait_queue_head
wait_queue_entry
: DECLARE_WAIT_QUEUE
, init_wait_queue_entry
, init_waitqueue_func_entry
wait queue 的手动添加和删除的API
add_wait_queue
和 add_wait_queue_exclusive
remove_wait_queue
wait queue 的基本API
wait_event
系列macrowake_up
系列macroWQ_FLAG_BOOKMARK
来分段遍历,减少单次对自旋锁的占用时间。WQ_FLAG_EXCLUSIVE
来实现单独唤醒,避免“惊群”。结合eventfd的实现来分析 wait queue 的使用
CppCon 2018: Nir Friedman “Understanding Optimizers: Helping the Compiler Help You”
编译器在完成阶段7和阶段8后,会生成目标文件。在Linux平台上,目标文件的格式为 ELF (executable linkable file)。ELF也是动态库、静态库、可执行文件和core dump文件的格式。本文会介绍:
编译的过程为编译原理所涉及的内容,不做展开。
主要关注:
C++ 程序从源文件到可执行文件,要经历9个翻译阶段。可以将一般认为的C++源文件到可执行文件的4个阶段模糊地和这9个翻译阶段相对应:
本文介绍翻译阶段1-6的全部过程:
可以看到大部分阶段都和字符集的转换,字面量的处理相关。
一个非原始字符串字面量的字符串字面量或一个字符字面量,先从源文件字符集 映射 源字符集,之后又从源字符集 映射到 执行字符集。
参考
C++ Templates: The Complete Guide
What is ADL? - Arthur O’Dwyer
P1601r0
CppCon 2019: Ben Deane “Everyday Efficiency: In-Place Construction (Back to Basics?)”
本文章适用于C++17(及后续)标准。