【发布时间】:2019-11-08 08:53:09
【问题描述】:
首先,让我把这个问题说得更具体一些。
说出来
检查一个类型的析构函数是否可以“忽略”
我是认真的
检查一个类在实例死亡时是否没有副作用。
我在做什么:
我正在为我们的 C++ 项目编写一个垃圾回收库,我需要提高性能。如果我能检测到传入的类型T在销毁时没有副作用,我可以只检查所有活着的对象,剩下的都是垃圾,可以标记为“垃圾”(典型的年轻代收集技术) )。但如果它有副作用,我必须扫描每一个垂死的对象并运行它的析构函数。
例如:
struct S1 {
int i;
}; // can be ignored
struct S2 {
int i;
~S2() {
}
}; // can be ignored
struct S3 {
S3() {
std::cout << "S3()" << std::endl;
}
virtual ~S3() {
std::cout << "~S3()" << std::endl;
}
}; // can not be ignored, destructor has side effect
struct S4 {
S3 s3;
}; // can not be ignored, destructor has side effect(calling s3's destructor)
// this is the most tricky one I tried and failed.
struct S5 {
S3 s3;
~S5() {
}
}; // same with S4
struct S6 : public S3 {
};// can not be ignored, super destructor has side effect
struct S7 : public S1 {
};// can be ignored, super destructor does not have side effect
struct S8 {
virtual ~S8() = default;
}; // can be ignored
// which cannot use is_trivially_destructible
struct S9 : public S8 {
}; // can be ignored
我尝试将is_destructible 和is_trivially_destructible 组合在一起,但这两个不能满足我的要求。尤其是例子4。
更重要的是: 欢迎任何可以解决此问题的编译器特定功能。
【问题讨论】: