我正在与一个声称支持C ++的平台上的开发人员交谈,但是他们同时说,在程序退出时清除的静态变量的数量被绑定到一个神奇的数字(我认为他们说他们的平台上有32个,他们说这符合C ++标准。
这是对的吗?
答案 0 :(得分:6)
标准规定,如果所有析构函数都有副作用,则必须调用它们。
[basic.start.term]/1:
析构函数(12.4)用于初始化对象(即生命周期(3.8)已开始的对象)与静态存储 由于从main返回并且由于调用std :: exit(18.5)而调用duration。 [...]
[basic.stc.static]/2:
如果具有静态存储持续时间的变量具有初始化或具有副作用的析构函数,则不应该是 除非可以消除类对象或其复制/移动,否则即使它似乎未被使用也被删除 如12.8中所述。 关键字static可用于声明具有静态存储持续时间的局部变量。
但是,有关标准合规性的规则确实允许在实施限制方面有一些余地:
[intro.compilance]/2.1:
如果某个程序不违反本国际标准中的规则,则符合条件的实施应在其资源限制内,接受并正确执行该程序。
对允许的静态变量数量的硬性限制可能看起来很奇怪,但是常见的实现对所有类型的事物都有严格的限制,例如:模板实例化深度。
答案 1 :(得分:2)
如果在程序退出时清除的静态变量有限制,那么它肯定不是C ++语言标准的强制要求。
根据平台,编译器和运行时库的不同,可能存在一些限制,即在具有小CPU能力和/或严格内存限制的嵌入式平台上。