我正在编写一个裸金属c++应用程序,它将进入一个无限循环,然后永远不会退出。
我有许多对象,它们将在main()的顶部构造,并且永远不会离开作用域。内存(包括代码和RAM)是非常宝贵的,因为我只有几个k字节可以使用。
优化器通常会为我去掉未使用的析构函数吗?如果没有,有没有办法告诉编译器不要生成任何默认析构函数?
还有,是否有类似的方法来摆脱类附带的一些其他默认函数(复制构造函数等)
在c++ 11中,可以删除默认析构函数和其他一些成员函数。对于类A
,可以使用。
~A() = delete;
也就是说,删除析构函数确实会对如何创建实例引入一些限制。
对于旧的(c++ 11之前的)编译器,简单地不声明析构函数。虽然编译器通常会创建析构函数,但它通常是内联的,什么也不做——因此编译器可能会选择完全删除代码。
您还需要阅读编译器文档(或检查它发出的代码)以了解它实际做什么。当涉及到消除未使用的代码时——包括c++ 11中的delete
成员函数——你依赖于编译器的实现质量。你可能还会发现不同的优化设置会影响它的功能(例如,是否一个空的内联编译器生成的析构函数实际上被优化了)。
如果使用的是c++ 11,则可以删除默认析构函数。检查下面的代码:
class A
{
public:
~A() = delete;
};
在某些情况下,当你不能删除析构函数时,那么你可以将这些东西从main函数的顶部移到全局作用域,使它们成为静态的,并使用-fno-use-cxa-atexit
,它不会在静态析构函数的退出处运行。从编译器选项中删除该形参,以使析构函数出现: