没有析构函数的 C++ 函数

C++ Functions with no destructor

我正在编写一个裸机 C++ 应用程序,它将进入一个无限循环,然后永不退出。

我有许多对象将在 main() 的顶部构造,并且永远不会离开范围。内存(代码和 RAM)非常宝贵,因为我只有几千字节可以使用。

优化器通常会为我删除未使用的析构函数吗?如果没有,有没有办法告诉编译器不要生成任何默认析构函数?

此外,是否有类似的方法来摆脱 类 附带的一些其他默认函数(复制构造函数等)。

如果您使用的是C++11,则可以删除默认析构函数。检查下面的代码:

class A
{
    public:
        ~A() = delete;
};

使用C++11,可以删除默认析构函数和一些其他成员函数。对于 class A 这可以用

来完成
 ~A() = delete;

也就是说,删除析构函数确实对如何创建实例引入了一些限制。

对于较旧的(C++11 之前的)编译器,只需不要声明析构函数即可。虽然编译器通常会创建一个析构函数,但它通常是内联的并且什么都不做——因此编译器可能会选择完全消除代码。

您还需要阅读编译器文档(或检查它发出的代码)以了解它的实际作用。当谈到消除未使用的代码时——包括 C++11 中的 deleted 成员函数——你依赖于编译器的实现质量。您可能还会发现不同的优化设置会影响它的作用(例如,一个空的内联编译器生成的析构函数是否实际上被优化为不存在)。

在某些情况下,当你不能只删除析构函数时,你可以将它们从 main 函数的顶部移动到全局范围,使它们成为静态的,并使用不会的 -fno-use-cxa-atexit 运行 在出口处静态析构函数。从编译器选项中删除参数,让析构函数浮出水面:

https://godbolt.org/z/4M484ThEM