这一篇介绍工程及环境配置
1 2
| gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) Description: Ubuntu 24.04 LTS
|
cmake 工程
- why
-fno-exceptions
: 异常安全会在协程里插入一些处理代码,影响理解
- why
-O1
: O0会产生很多冗余的指令,没有O1看着干净。当然我们也需要某些地方不加优化,参见 gcc 禁止优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| cmake_minimum_required(VERSION 3.10)
set(${CMAKE_HOST_SYSTEM_NAME} TRUE) set(CMAKE_CXX_STANDARD 20) project(TEST) aux_source_directory(. SRCS)
if(Linux) add_compile_options(-fcoroutines) message(CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}) set(CMAKE_CXX_FLAGS_DEBUG "-O1 -g -fno-exceptions") endif()
include_directories(.)
foreach(src ${SRCS}) string(REGEX REPLACE ".*/([^/\\]*)\.cpp" "\\1" name "${src}") message("src=${src} name=${name}") add_executable(${name} ${src}) endforeach()
|
调试
随意,但qtcreator的视图蛮不错(设置operator on instruction的快捷键),当然vscode也可以


utils
gcc 禁止优化
1 2 3 4
| #pragma GCC push_options #pragma GCC optimize("O0") extern "C" FORCE_NOINLINE void TagFunc(int){} #pragma GCC pop_options
|
我们将使用这个函数,作为代码间的tag,建立源码与汇编码之间的节点映射,如下使用
这将被编译成
1 2
| mov 0x02, %rdi call TagFunc
|
utils.hpp code
1 2 3 4 5 6 7
| #pragma once #include <stdio.h> #define FORCE_NOINLINE __attribute__((noinline)) #define LOG(...) printf(__VA_ARGS__) #define WLOG(...) wfprintf(__VA_ARGS__)
|