detach的理解

博客介绍了detach的作用,它重新声明变量指向原变量存放位置,且requires_grad为false。计算图从detach过的变量处断开,使其成为leaf_node,即便后续将requires_node置为true,该变量也不会具有梯度。

detach所做的就是,重新声明一个变量,指向原变量的存放位置,但是requires_grad为false.更深入一点的理解是,计算图从detach过的变量这里就断了, 它变成了一个leaf_node.即使之后重新将它的requires_node置为true,它也不会具有梯度.

来源:

https://www.jianshu.com/p/f1bd4ff84926

### Qt 中 Detach 的概念与用法 在 Qt 编程中,`detach` 是一种用于处理共享对象的核心机制。它主要涉及隐式的数据共享(Implicit Data Sharing),这是许多 Qt 类(如 `QString` 和 `QVector`)的基础设计原则之一。 #### 隐式数据共享的工作原理 当多个实例共享同一份底层数据时,Qt 使用引用计数来跟踪这些共享的数据副本。只有在某个实例尝试修改该数据时,才会触发 `detach` 操作。这意味着会创建一份独立的拷贝供当前实例独占使用[^3]。这种技术显著提高了性能并减少了内存消耗,因为只读操作不会引发不必要的复制行为。 #### Detach 发生的具体场景 以下是可能导致 `detach` 操作的一些常见情况: - 当一个可变的对象被修改时,如果其内部数据正在与其他对象共享,则会发生分离。 - 调用任何可能改变对象状态的方法都会导致检测是否需要执行 `detach` 操作[^4]。 例如,在字符串类 `QString` 或容器类 `QList` 中,只要调用了非 const 方法(比如 append() 或 insert()),就会自动检查是否有其他外部引用指向相同的底层数据结构;如果有,则先完成深拷贝再继续后续逻辑处理过程[^5]。 #### 示例代码展示 detach 过程 下面通过一段简单的 C++ 程序演示了如何利用 QString 来观察 detach 行为: ```cpp #include <QString> #include <QDebug> int main(){ QString str1 = "Hello"; QString str2 = str1; // 此处不发生 deep copy qDebug() << "Before modification:"; qDebug() << "str1:" << &str1 << str1; qDebug() << "str2:" << &str2 << str2; str2.append(" World"); // 修改 str2 将触发 detach qDebug() << "\nAfter modifying str2:"; qDebug() << "str1:" << &str1 << str1; qDebug() << "str2:" << &str2 << str2; return 0; } ``` 上述程序展示了两个 QString 对象之间的关系变化:最初它们共同拥有同一个实际存储区域的内容直到其中一个进行了写入动作之后才真正形成了各自的版本[^6]。 #### 总结 理解 Qt 中关于 detach 的工作方式对于优化应用程序非常重要。合理运用这一特性可以有效减少资源浪费的同时保持良好的运行效率。然而需要注意的是频繁地造成 detach 可能反而降低整体表现因此开发者应当谨慎评估何时以及怎样去调整那些基于共享指针实现的功能模块[^7]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值