C++ C/C+;中是否需要全局析构函数+;编程?

C++ C/C+;中是否需要全局析构函数+;编程?,c++,c,C++,C,当程序初始化时,\u do\u global\u ctors\u aux函数执行全局对象构造 当程序退出时,\u do\u global\u dtors\u aux函数执行全局对象销毁 问题是“是否有必要使用\u全局\u dtors\u aux 程序退出后,操作系统应回收全局对象的内存。 尽管程序员可能喜欢在析构函数中输出一些结果或消息,但我认为这可以在代码中的其他显式位置完成。除此之外,全局析构函数对我来说似乎是多余的。我错过什么了吗 更具体地说,非对象类型变量的销毁既不会影响当前程序行为,也

当程序初始化时,
\u do\u global\u ctors\u aux
函数执行全局对象构造

当程序退出时,
\u do\u global\u dtors\u aux
函数执行全局对象销毁

问题是“是否有必要使用
\u全局\u dtors\u aux

程序退出后,操作系统应回收全局对象的内存。 尽管程序员可能喜欢在析构函数中输出一些结果或消息,但我认为这可以在代码中的其他显式位置完成。除此之外,全局析构函数对我来说似乎是多余的。我错过什么了吗

更具体地说,非对象类型变量的销毁既不会影响当前程序行为,也不会影响其他系统资源。当C和C++程序中的程序退出时,它会触发“γdodoGalAlxDrssx AUX”函数吗? 在使用gcc或g++编译的以下程序的程序集中有“\u do\u global\u dtors\u aux”标签。但我不确定它是否会运行到

例如:

#include <stdio.h>

int a[100];

void func(unsigned int i)
{
    if (i < 100)
        printf("a[%d] = %d\n", i, a[i]);
}

int main()
{
    func(30);
    return 0;
}
#包括
INTA[100];
void func(无符号整数i)
{
如果(i<100)
printf(“a[%d]=%d\n”,i,a[i]);
}
int main()
{
func(30);
返回0;
}

<> P> > C++标准要求在程序结束之前调用全局析构函数,以使它们的构造顺序相反。在C语言中,当程序终止时,还有一些必需的操作(例如刷新和关闭文件)

有些对象管理内存以外的资源。锁定互斥体(或文件)并在未正确清理的情况下终止的程序会给使用相同互斥体(或文件)的其他程序带来麻烦


此外,并非所有操作系统都从终止进程中回收内存。

不仅在进程退出后由操作系统回收全局对象,而且所有内存都分配给该进程。从设计的角度来看,至少“全球合作者/全球合作者”是好的。缺少“全球合作者”会让人感到困惑和不好。作为开发人员,我们不关心_do_global_ctors_aux/_do_global_ctors_aux,通常我们关注构造函数/析构函数。在进程退出之前释放所有内存是一种良好的编程习惯。

与其说“是否需要全局析构函数”,不如说还有两个更重要的问题要问:

  • 全局析构函数有用吗
  • 可以依赖全局析构函数吗
对于后者,答案是最明显的。有许多方法可以使程序在没有机会执行任何操作的情况下死掉(例如在类Unix系统上执行
\u exit
SIGKILL
)。即使是
atexit
sigaction
也不允许您正常展开堆栈


也就是说,我认为如果你必须使用全局变量(通常不使用是个很好的主意),调用它们的析构函数会很有帮助,因此,您可以使用
valgrind

之类的工具更轻松地跟踪资源问题,内存显然不是唯一需要担心的问题。您要问的是什么?类在
C++
中的工作方式是,程序员可以决定当它们被破坏时需要发生什么。因此,
C++
运行时需要调用函数来销毁程序员的所有全局对象。相关概念我真正关心的是一些冗余的全局破坏可能会损害性能,特别是对于频繁触发的程序。如果程序员知道全局销毁是不必要的(没有与其他程序或操作系统共享的资源),如何防止这种开销。如果您想避免全局销毁的开销,只需完全避免使用全局对象(良好做法)或确保您的所有全局对象都有不起任何作用的析构函数。这意味着您的全局对象也不应该使用需要放弃的全局(系统)资源。也就是说,在你有证据证明需要之前担心这些事情(例如,通过测试和发现程序终止时的性能瓶颈)被称为过早优化是有原因的。