避免静态变量初始化检查,当我 100% 确定它已经初始化时

问题描述 投票:0回答:0

我的互联网研究

静态变量会在第一次使用时被初始化

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
  • 我可以节省100%的分行成本(?)。

我的解决方案有一些问题。

  • 我靠那个
    &B::bbbb == (&B::aaaa)+1
    。这既不酷又危险。
  • 调用
    B::aaaa
    时,编译器可能仍会检查
    B_get()
    的初始化。

问题

如何在不执行检查

B::bbbb
是否已初始化的隐藏代码(由编译器)的情况下获取值
B::bbbb

c++ optimization initialization c++17 static-variables
© www.soinside.com 2019 - 2024. All rights reserved.