静态变量会在第一次使用时被初始化
class B{ static int bbbb;}
int B::bbbb=42;
Stackoverflow 帖子指出代码通常会被编译成 if-else。
然而,分支预测大多数时候是正确的。我不用担心。
class B{ static int bbbb; static bool bbbb_INIED=false; }
int B::bbbb;
///v when used
if(!bbbb_INIED){bbbb_INIED=true; B::bbbb=42;}
我很固执。我仍然怀疑这个分支会导致我的程序出现瓶颈。
在我的程序中(有很多.cpp),有一个函数
B_get()
返回值B::bbbb
.
根据我的设计,
B_get()
always 调用after B::bbbb
is initialized.
Edit::
B::bbbb
在运行时使用复杂的逻辑在遥远的源文件中初始化。实际上,它不是恒定的。
我将检查优化为MCVE ::-
#include <iostream>
#include <cstdlib>
class B{public:
static int aaaa;
static int bbbb;
};
int B::aaaa;
int B::bbbb=42;
int B_get(){
return *(( &(B::aaaa) )+1) ; ///instead of "return B::bbbb;"
}
int main(){
std::cout<<B::aaaa;
std::cout<<B_get();
}
乍一看,它看起来很棒。
B_get()
似乎读取未初始化的内存并返回 0(不是 42)。B_get()
根本不需要初始化B::bbbb
。我的解决方案有一些问题。
&B::bbbb == (&B::aaaa)+1
。这既不酷又危险。B::aaaa
时,编译器可能仍会检查B_get()
的初始化。如何在不执行检查
B::bbbb
是否已初始化的隐藏代码(由编译器)的情况下获取值B::bbbb
?