关于 C++ 的一些知识

链接 链接性(Linkage)指的是符号(如变量和函数)在不同翻译单元之间的可见性。C/C++中有三种链接性:

  1. 内部链接性(Internal Linkage):符号只能在定义它的翻译单元内可见。
  2. 外部链接性(External Linkage):符号可以在多个翻译单元之间共享。默认情况下,函数和全局变量具有外部链接性。
  3. 无链接性(No Linkage):符号只能在定义它的块内可见。局部变量和函数参数具有无链接性。

对于全局变量和函数,有以下关键字可用于指定链接性:

  1. static
    static 修饰的全局变量和函数具有内部链接性,即只在它所处的翻译单元内可见。
1
2
3
static int a = 100;
static float b = 3.14f;
static void print();
  1. extern
    extern 修饰的全局变量和函数具有外部链接性,即可以在多个翻译单元之间共享。
1
2
3
extern int a = 100;
extern int add(int a, int b);
extern int printf(const char *__restrict __format, ...);

他们的定义可以在自身的翻译单元,也可以在别的翻译单元中。

  1. const
    const 修饰全局变量除了指定其为常量以外,还使其默认具有内部链接性,但可以显示指定 extern 使其具有外部链接性。
1
2
3
const int a = 42;           // 具有内部链接性
static const int b = 42; // 具有内部链接性
extern const int c = 42; // 具有外部链接性
  1. inline
    inline 修饰符修饰的函数和变量具有外部链接性,与 extern 不同,inline 允许函数被定义多次,但是每个定义必须相同,称作外部静态链接。在此之前,如果把函数的实现和全局变量定义也写在头文件中,那么函数和变量就会被多个翻译单元同时定义,造成重复定义。使用 inline 后,函数的实现和变量定义就可以写在头文件中。
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef TEST_H
#define TEST_H

#include <stdio.h>

inline void print() {
printf("Hello, world!");
}

inline int a = 100;

#endif

这个头文件就不会引起重复定义。

库文件是用于在不同程序中重用代码而产生的,具体分为静态链接库动态链接库两种。
动态库静态库是两种用于代码重用和共享的库文件形式。他们在编译和链接过程中具有不同的行为和用途。
静态库是在编译时将库的代码复制到最终可执行文件中。静态库通常具有 .a.lib 后缀。

  • 编译时链接:静态库在编译时被链接到可执行文件中。
  • 独立性:生成的可执行文件包含所有必要的库代码,因此在运行是不需要依赖外部库文件。
  • 文件大小:大。
  • 更新困难:如果库代码需要更新,必须重新编译所有使用该库的可执行文件。

动态库是在运行时由操作系统加载到内存中。动态库通常具有 .so.dll 后缀。

  • 运行时链接:动态库在运行时被链接到可执行文件中。
  • 共享性:多个可执行文件可以共享同一个动态库,减少内存占用和磁盘空间。
  • 文件大小:小。
  • 更新方便:只需更新动态库文件。

GDB 调试

FFMpeg

FFmpeg 是一个强大的多媒体处理工具,广泛用于视频和音频的转换、处理等操作。以下是一些常用的 FFmpeg 参数:

输入和输出参数

  • -i <input_file>:指定输入文件。
  • <output_file>:指定输出文件(通常放在参数的最后)。

格式转换

  • -f <format>:指定输出格式,例如 mp4mp3wav 等。

视频编码参数

  • -c:v <codec>:指定视频编码器,比如 libx264libx265mpeg4
  • -b:v <bitrate>:指定视频比特率,比如 1M 表示 1 Mbps。
  • -r <fps>:设置视频帧率(如 3060 等)。
  • -s <resolution>:设置分辨率(如 1920x1080)。
  • -crf <value>:恒定速率因子,控制视频质量(范围通常是 0-51,越低质量越好,常用 23 左右)。
  • -preset <speed>:设置编码速度,例如 ultrafastsuperfastveryfastfasterfastmediumslowslowerveryslow。越快文件越大,但编码速度越快。

音频编码参数

  • -c:a <codec>:指定音频编码器,比如 aacmp3pcm_s16le
  • -b:a <bitrate>:指定音频比特率,比如 128k
  • -ar <rate>:设置音频采样率,比如 44100
  • -ac <channels>:设置音频通道数,比如 1(单声道)或 2(立体声)。

截取和裁剪

  • -ss <time>:设置开始时间,格式如 00:01:30 表示从 1 分 30 秒处开始。
  • -to <time>:设置结束时间。
  • -t <duration>:设置持续时间,比如 00:00:10 表示截取 10 秒长的视频。
  • -vf "crop=w:h:x:y":裁剪视频的宽、高和起始位置。例如,crop=1920:1080:0:0 表示裁剪 1920x1080 的区域,从左上角开始。

缩放与旋转

  • -vf "scale=<width>:<height>":调整视频分辨率。
  • -vf "transpose=<value>":旋转视频(0=90° 顺时针,1=90° 逆时针,2=水平翻转,3=垂直翻转)。

其他常用参数

  • -an:去除音频。
  • -vn:去除视频。
  • -y:自动覆盖输出文件。
  • -threads <num>:设置线程数来加速处理。
  • -filter_complex:用于更复杂的滤镜操作(如叠加、拼接)。

示例

  • 转换格式ffmpeg -i input.mp4 output.avi
  • 截取视频ffmpeg -i input.mp4 -ss 00:00:30 -t 10 output.mp4
  • 改变分辨率ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
  • 压缩视频ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4
  • 提取音频ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3

设计模式

Linux 进阶

  1. ps
  2. htop
  • 挂起进程
  • jobs 后台运行
  • fg %1
    nuhup
    在命令后加 & 符号,可以将命令放入后台运行。

systemd systemd status
jounalctl -eu 查看某个服务最后的日志

创建一个自己的服务

sudo vim /etc/systemd/system/myservice.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=My Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/myservice
Restart=always

[Install]
WantedBy=multi-user.target

重载配置文件
sudo systemctl daemon-reload

使用 systemctl 命令启动、停止、重启服务
sudo systemctl enable/disable ping
sudo systemctl start/stop/restart myservice

用户和权限

/etc/passwd 包含了所有用户的信息,包括用户名、密码、UID、GID、描述、家目录、登录 shell 等。
etc/group 包含了所有用户组的信息,包括组名、GID、包含的用户等。

把用户加入docker组,可以免密码使用docker命令。

useradd 命令用于创建用户,-m 参数用于创建用户的家目录。
usermod name -aG group username 命令用于修改用户信息。
userdel 命令用于删除用户。

ls 硬链接数 所有者 所有组