作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 C++ 相当陌生,当我在构造函数和析构函数的行为中徘徊时,我发现了这个问题:
#include <iostream>
struct Student {
std::string a;
~Student() {
std::cout << "Destructor called\n";
}
} S;
int main() {
std::cout << "Before assigning to S\n";
S = {""};
std::cout << "After assigning to S\n";
}
当我用
g++
编译上面的代码时并运行它,它打印:
Before assigning to S
Destructor called
After assigning to S
Destructor called
但是当我改变
std::string a;
至
const char *a;
,然后打印:
Before assigning to S
After assigning to S
Destructor called
谁能解释为什么这一变化使析构函数少运行一次?
最佳答案
您正在查看 Copy Elision .这是一种优化,在某些情况下将绕过临时对象的构造。
在 GCC 中,可以通过传递以下编译器标志来禁用它(尽管通常不推荐这样做):
-fno-elide-constructors
在您的情况下,我认为优化是由于结构成为微不足道的类型而触发的,因此它被视为 POD(纯旧数据),并且在不构造对象的情况下简单地修改了内存。
-fno-elide-constructors
的效果:
https://godbolt.org/z/c3qrMEr9s
关于c++ - 为什么 struct 的析构函数是否运行取决于成员变量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66848369/
我是一名优秀的程序员,十分优秀!