Skip to content

Execution model

在工程Linux-OS中总结了 Process execution model,它是通用的execution model,对使用C++编写的program同样适用;但是,对于C++ program,它也有一些个性化的特性,这些特性是需要C++ programmer掌握的,本文对C++中于此相关的内容进行梳理,建立起一个更加完整的C++ execution model,下面是于此相关的内容:

使用scope来进行描述

Scope是一个静态/compile-time概念,但是C++中很多**dynamic/runtime概念**,其实也是基于它而创建的,从后面的内容可以看到,很多**dynamic/runtime概念**都和scope相关,或者说是**一致**的,这种static(program static structure)和dynamic(object lifetime、execution)的**一致性**,能够帮助programmer理解program的execution。

Function execution

NOTE: 在阅读本章内容之前,需要有如下认知:

1、cppreference Statements

Compound statements or blocks are brace-enclosed sequences of statements.

C++ block是compound statement的同义词

2、cppreference Scope # Block scope

每个block有一个独立的scope

3、cppreference Function declaration

每个function有一个独立的scope

1、Function execution有**stack frame**,当function termination的时候,会进行**stack unwinding**;

一致性: function termination->scope exit

2、可以认为: function中的每个**block**都有自己独立的**stack frame**,它的stack frame是nested in enclosing block的stack frame的。当block结束时,会执行stack unwinding;

一致性: block termination->scope exit

thought: C++中每个block(scope)都有一个自己的stack frame。

因此: 在function execution中:

1、**scope enter**时,入栈,allocation,construct object,constructor被执行

2、**scope exit**时,出栈,执行stack unwinding,deallocation,destruct object,destructor被执行;

由于C++中,scope是**nesting**的,因此上述过程也是**nesting**的;

thought: 对于与function Invokation相关的,大多数 都是可以使用scope来进行刻画

在scope exit的时候,会执行stack unwinding,C++ 的很多feature都是建立在stack unwinding上;

Scope and object lifetime

关于scope和object lifetime,参见:

1) Declarations的Notes段中有描述

2) 参见 C++\Language-reference\Basic-concept\Object\Lifetime-and-storage-duration 章节

3、cppreference Storage class specifiers

Together with the scope of the name, they control two independent properties of the name: its storage duration and its linkage.

Scope based idiom

C++对stack unwind有着非常充分的运用,很多idiom都是建立在stack unwind之上的。

一、RAII

C++中的RAII和scope密切相关,所以C++的scope和resource management之间有着强烈的关联。

基于RAII的:

1、scope guard

scoped_***

boost scoped_ptr

cppreference std::scoped_lock

boost Boost ScopeExit

boost::mutex::scoped_lock