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