Во-первых, позвольте мне сделать этот вопрос более конкретным.
Сказав
проверить, можно ли "игнорировать" деструктор типа
Я имею в виду
проверить, нет ли у класса побочных эффектов, когда его экземпляры умирают.
Что я делаю:
Я пишу библиотеку для сборки мусора для наших проектов 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.
Более того: Приветствуются любые особенности компилятора, которые могут решить эту проблему.