gpt4 book ai didi

c++ - 为什么 struct 的析构函数是否运行取决于成员变量的类型?

转载 作者:行者123 更新时间:2023-12-04 11:06:49 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com