4.19析构函数/运算符重载

本文介绍了C++中的析构函数,它在函数调用结束时自动执行,用于清理善后工作。析构函数无参数、无返回值,并且每个类只有一个。当需要释放特殊资源时,需要编写析构函数。此外,文章还讨论了运算符重载,特别是流插入和提取运算符的重载,这些通常作为友元函数实现,返回输出流对象。

1.析构函数

  • 函数调用结束会自动执行析构函数。(譬如在return 0时)
  • 进行清理善后的工作。
  • 析构函数没有参数(不能被重载),没有返回值,一个类里只能有一个析构函数。
  • 编译器总是会为类生成一个析构函数,称为合成析构函数(synthesized destructor)
  • 合成析构函数:按对象创建时的逆序撤销每个非静态成员。
  • 合成析构函数并不删除指针成员所指向的对象。(需要显式编写析构函数)

2.带默认参数的构造函数

3.何时需要编写析构函数
析构函数通常用于释放在构造函数或在对象生命期内获取的资源。

  • 析构函数三法则
    如果类需要析构函数,则该类几乎必然需要定义自己的复制构造函数赋值运算符重载。
    Point pt1=pt2; pt1=pt2;
    目的:实现深拷贝
    在这里插入图片描述

2.运算符重载
在这里插入图片描述在这里插入图片描述
为什么用引用&:
因为通过地址引用比通过对象要快

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有参数是为了区分前置和后置
在这里插入图片描述
前置:

在这里插入图片描述
后置:
在这里插入图片描述
分数fraction
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

典型运算符的重载

在这里插入图片描述
在这里插入图片描述
重载流运算符
在这里插入图片描述
在这里插入图片描述
返回值必须是一个输出流对象。
运算对象可以作为左值。

流插入和提取重载函数不能是类的成员函数,只能是友元函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
单目运算符

mouse@mouse-virtual-machine:~/workspace/kernel/linux-4.19.3$ make -j8 scripts/kconfig/conf --syncconfig Kconfig SYSTBL arch/x86/include/generated/asm/syscalls_32.h SYSHDR arch/x86/include/generated/asm/unistd_32_ia32.h SYSTBL arch/x86/include/generated/asm/syscalls_64.h SYSHDR arch/x86/include/generated/asm/unistd_64_x32.h SYSHDR arch/x86/include/generated/uapi/asm/unistd_64.h SYSHDR arch/x86/include/generated/uapi/asm/unistd_32.h SYSHDR arch/x86/include/generated/uapi/asm/unistd_x32.h UPD include/config/kernel.release WRAP arch/x86/include/generated/uapi/asm/bpf_perf_event.h WRAP arch/x86/include/generated/uapi/asm/poll.h UPD include/generated/uapi/linux/version.h UPD include/generated/utsrelease.h DESCEND objtool HOSTCC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/fixdep.o HOSTLD /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/fixdep-in.o LINK /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/fixdep CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/builtin-check.o GEN /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/arch/x86/lib/inat-tables.c CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/arch/x86/decode.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/exec-cmd.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/builtin-orc.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/help.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/pager.o In file included from help.c:12: In function ‘xrealloc’, inlined from ‘add_cmdname’ at help.c:24:2: subcmd-util.h:56:23: error: pointer may be used after ‘realloc’ [-Werror=use-after-free] 56 | ret = realloc(ptr, size); | ^~~~~~~~~~~~~~~~~~ subcmd-util.h:52:21: note: call to ‘realloc’ here 52 | void *ret = realloc(ptr, size); | ^~~~~~~~~~~~~~~~~~ subcmd-util.h:58:31: error: pointer may be used after ‘realloc’ [-Werror=use-after-free] 58 | ret = realloc(ptr, 1); | ^~~~~~~~~~~~~~~ subcmd-util.h:52:21: note: call to ‘realloc’ here 52 | void *ret = realloc(ptr, size); | ^~~~~~~~~~~~~~~~~~ CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/check.o cc1: all warnings being treated as errors mv: 对 ‘/home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/.help.o.tmp’ 调用 stat 失败: 没有那个文件或目录 make[4]: *** [/home/mouse/workspace/kernel/linux-4.19.3/tools/build/Makefile.build:96:/home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/help.o] 错误 1 make[3]: *** [Makefile:52:/home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/libsubcmd-in.o] 错误 2 make[2]: *** [Makefile:54:/home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/libsubcmd.a] 错误 2 make[2]: *** 正在等待未完成的任务… CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/orc_gen.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/orc_dump.o LD /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/arch/x86/objtool-in.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/elf.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/special.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/objtool.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/libstring.o CC /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/str_error_r.o HOSTCC arch/x86/tools/relocs_32.o HOSTCC arch/x86/tools/relocs_64.o WRAP arch/x86/include/generated/asm/dma-contiguous.h HOSTCC arch/x86/tools/relocs_common.o WRAP arch/x86/include/generated/asm/early_ioremap.h WRAP arch/x86/include/generated/asm/export.h WRAP arch/x86/include/generated/asm/mcs_spinlock.h WRAP arch/x86/include/generated/asm/mm-arch-hooks.h CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig HOSTLD arch/x86/tools/relocs CC scripts/mod/devicetable-offsets.s LD /home/mouse/workspace/kernel/linux-4.19.3/tools/objtool/objtool-in.o make[1]: *** [Makefile:63:objtool] 错误 2 make: *** [Makefile:1644:tools/objtool] 错误 2 make: *** 正在等待未完成的任务… MKELF scripts/mod/elfconfig.h HOSTCC scripts/kallsyms HOSTCC scripts/selinux/genheaders/genheaders In file included from scripts/selinux/genheaders/genheaders.c:19: ./security/selinux/include/classmap.h:249:2: error: #error New address family defined, please update secclass_map. 249 | #error New address family defined, please update secclass_map. | ^~~~~ HOSTCC scripts/selinux/mdp/mdp make[3]: *** [scripts/Makefile.host:90:scripts/selinux/genheaders/genheaders] 错误 1 make[2]: *** [scripts/Makefile.build:546:scripts/selinux/genheaders] 错误 2 make[2]: *** 正在等待未完成的任务… HOSTCC scripts/mod/modpost.o HOSTCC scripts/pnmtologo In file included from scripts/selinux/mdp/mdp.c:49: ./security/selinux/include/classmap.h:249:2: error: #error New address family defined, please update secclass_map. 249 | #error New address family defined, please update secclass_map. | ^~~~~ make[3]: *** [scripts/Makefile.host:90:scripts/selinux/mdp/mdp] 错误 1 make[2]: *** [scripts/Makefile.build:546:scripts/selinux/mdp] 错误 2 make[1]: *** [scripts/Makefile.build:546:scripts/selinux] 错误 2 make[1]: *** 正在等待未完成的任务… UPD scripts/mod/devicetable-offsets.h HOSTCC scripts/mod/sumversion.o HOSTCC scripts/mod/file2alias.o HOSTLD scripts/mod/modpost make: *** [Makefile:1067:scripts] 错误 2
08-06
<think>我们之前已经确认在Linux 4.19的`drivers/usb/storage/usb.c`中没有`max_queue_depth`参数,而是通过`scsiglue.c`中的`cmd_per_lun`来控制队列深度。但是,如果用户希望直接修改源码来配置队列深度,应该修改`scsiglue.c`中的模块参数。 然而,问题要求修改源码配置,即修改内核源码并重新编译。以下是具体步骤: ### 修改源码配置队列深度(以cmd_per_lun为例) #### 1. 定位关键源码文件 文件路径:`drivers/usb/storage/scsiglue.c` #### 2. 修改模块参数默认值 在`scsiglue.c`中,找到`usb_stor_host_template`结体的初始化,以及模块参数`cmd_per_lun`的声明。 原始代码片段: ```c static struct scsi_host_template usb_stor_host_template = { .name = "usb-storage", .cmd_per_lun = 1, // 默认值为1 /* ... 其他字段 ... */ }; module_param_named(cmd_per_lun, usb_stor_host_template.cmd_per_lun, int, 0644); MODULE_PARM_DESC(cmd_per_lun, "max commands per logical unit"); ``` 修改方法:将默认值从1改为所需的值(例如32): ```c static struct scsi_host_template usb_stor_host_template = { .name = "usb-storage", .cmd_per_lun = 32, // 修改为32 /* ... 其他字段 ... */ }; ``` #### 3. 重新编译并安装内核模块 步骤: ```bash # 进入内核源码目录 cd /path/to/linux-4.19 # 编译usb-storage模块 make M=drivers/usb/storage # 备份旧模块 sudo cp /lib/modules/$(uname -r)/kernel/drivers/usb/storage/usb-storage.ko /lib/modules/$(uname -r)/kernel/drivers/usb/storage/usb-storage.ko.bak # 安装新模块 sudo cp drivers/usb/storage/usb-storage.ko /lib/modules/$(uname -r)/kernel/drivers/usb/storage/ # 更新模块依赖 sudo depmod -a # 重新加载模块 sudo rmmod usb_storage sudo modprobe usb_storage ``` #### 4. 验证修改 ```bash cat /sys/module/usb_storage/parameters/cmd_per_lun # 应输出32 ``` ### 注意事项 - 如果使用UASP(uas驱动),则需同时修改`uas`驱动。UASP驱动的队列深度控制位于`drivers/usb/storage/uas.c`,其默认值通常为64,修改方式类似。 - 修改内核模块需要重新编译内核或模块,并确保与当前运行的内核版本一致。 §§相关问题§§ 1. 在Linux 4.19内核中,修改`drivers/usb/storage/scsiglue.c`的`cmd_per_lun`默认值后,如何确保修改不会在后续内核升级中被覆盖? 2. 除了修改`scsiglue.c`源码,还有哪些内核编译配置选项会影响USB存储设备的队列深度? 3. 当同时使用`usb-storage`和`uas`驱动时,如何避免两个驱动之间的队列深度配置冲突? 4. 在嵌入式系统中,如何通过设备树(Device Tree)配置覆盖`usb-storage`驱动的`cmd_per_lun`参数? 5. 修改`cmd_per_lun`后,如何通过`perf`工具验证队列深度增加对USB SSD随机读写性能的影响? </think> ### Linux 4.19 USB存储驱动队列深度源码配置指南 在Linux 4.19内核中,`drivers/usb/storage/usb.c`确实没有`max_queue_depth`参数。正确的配置需要修改`scsiglue.c`文件,以下是详细步骤: #### 1. 定位正确源码文件 **核心文件**:`drivers/usb/storage/scsiglue.c` ```c // 约第972行附近 static struct scsi_host_template usb_stor_host_template = { .name = "usb-storage", .cmd_per_lun = 1, // ★ 队列深度控制参数 ★ /* ...其他字段... */ }; // 模块参数声明(约第1160行) module_param_named(cmd_per_lun, usb_stor_host_template.cmd_per_lun, int, 0644); MODULE_PARM_DESC(cmd_per_lun, "max commands per logical unit"); ``` #### 2. 修改源码配置 ```diff --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -969,7 +969,7 @@ static struct scsi_host_template usb_stor_host_template = { .name = "usb-storage", - .cmd_per_lun = 1, + .cmd_per_lun = 32, /* 增加队列深度到32 */ .max_sectors = 240, .sg_tablesize = SG_ALL, .use_clustering = ENABLE_CLUSTERING, ``` #### 3. USB 3.0/UASP设备额外优化 对于USB 3.0设备(`uas.c`驱动),需同步修改: ```diff --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c @@ -1004,7 +1004,7 @@ static struct scsi_host_template uas_host_template = { .name = "uas", - .cmd_per_lun = 32, + .cmd_per_lun = 64, /* UASP默认更高 */ .max_sectors = 65535, ``` #### 4. 编译安装步骤 ```bash # 1. 修改源码后编译模块 make M=drivers/usb/storage # 2. 备份原驱动 sudo cp /lib/modules/$(uname -r)/kernel/drivers/usb/storage/{usb-storage.ko,uas.ko} /backup # 3. 安装新驱动 sudo cp drivers/usb/storage/{usb-storage.ko,uas.ko} /lib/modules/$(uname -r)/kernel/drivers/usb/storage/ # 4. 更新依赖并加载 sudo depmod -a sudo modprobe -r uas usb_storage sudo modprobe usb_storage cmd_per_lun=32 sudo modprobe uas ``` #### 5. 验证配置 ```bash # 检查内核参数 cat /sys/module/usb_storage/parameters/cmd_per_lun # 查看设备实际队列深度 cat /sys/block/sdX/device/queue_depth # 监控队列使用情况 echo 1 > /sys/block/sdX/device/trace_enable dmesg | grep "scsi_queue" ``` #### 6. 动态调整补丁(可选) 若要支持运行时修改,添加sysfs接口: ```c // 在scsiglue.c中添加 static int cmd_per_lun_set(const char *val, const struct kernel_param *kp) { int ret = param_set_int(val, kp); scsi_adjust_queue_depth(us_to_host(us), MSG_SIMPLE_TAG, usb_stor_host_template.cmd_per_lun); return ret; } static struct kernel_param_ops cmd_per_lun_ops = { .set = cmd_per_lun_set, .get = param_get_int, }; module_param_cb(cmd_per_lun, &cmd_per_lun_ops, &usb_stor_host_template.cmd_per_lun, 0644); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值