|
1
3
二者都
具体来说,对于变量模板,规则是 [temp.inst]/6 :
在你的职能中:
但是
请注意,虽然该语言需要全局对象
|
|
|
2
2
C++编译器可以自由实现任何优化 这没有明显的效果 编译器可以忽略有关函数调用的所有其他内容,而不是实际编译函数调用本身,但是编译器必须做任何需要做的事情来进行安排,以便初始化静态类成员 犹如 该函数调用已完成。 如果编译器可以确定程序中没有其他内容实际使用静态类成员,并且完全删除它不会产生明显的效果,那么编译器可以删除静态类成员以及初始化它的函数(因为没有其他内容引用该函数)。 请注意,即使获取函数(或类成员)的地址也会产生可观察的效果,因此,即使没有任何东西真正调用函数,但某些东西获取了函数的地址,它也不会消失。 P.S.-以上所有假设在C++代码中没有未定义的行为。当未定义的行为进入画面时,所有的规则都消失了。 |
|
|
3
1
简单的回答是它有效。 长话短说的答案是它有效 除非 链接器将丢弃整个翻译单元(.obj)。 当您创建一个.lib并链接它时,可能会发生这种情况。链接器通常根据“我是否使用obj导出的符号”的依赖关系图从库中选择要链接的.obj。
我曾在叮当声中体验过这一点。我们正在创建自我注册的工厂,还有一些正在被撤销。为了解决这个问题,我们创建了一些宏,这些宏导致存在一个无关紧要的依赖项,从而防止obj文件被丢弃。 这与其他答案并不矛盾,因为链接库的过程是决定程序中有什么和没有什么的过程。 |