gpt4 book ai didi

c++ - MSVC 如何优化静态变量的使用?

转载 作者:IT老高 更新时间:2023-10-28 23:00:49 32 4
gpt4 key购买 nike

我对 Microsoft Visual C++ 编译器如何处理/优化静态变量感兴趣。

我的代码:

#include <cstdlib>

void no_static_initialization()
{
static int value = 3;
}

void static_initialization(int new_value)
{
static int value = new_value;
}

int main()
{
no_static_initialization();
static_initialization(1);
static_initialization(std::rand());

return 0;
}

这是代码的程序集(经过优化编译):

picture of the assembly listing

我的主要兴趣领域是最后一个案例。

在这里,第一个语句得到了完全优化,第二个语句的两个调用被内联,它们实际上代表了类似的代码块。

他们每个人都测试某事,然后如果测试不成功,则进行一个简短的跳转(这些跳转显然指向相应例程的结束)。

编译器是否会明确检查每个函数调用是否是第一次调用该函数?
编译器是否真的有一个flag,它表明这是不是第一次调用函数?
它存储在哪里(我猜所有 test 的东西都是关于它的,但我不确定)?

最佳答案

是的,编译器必须添加一个隐藏标志来测试它是否是对函数的第一次调用并根据它进行初始化。在这两个片段中,它都在测试标志,如果它被提升,它将跳转到函数的末尾,否则它将初始化静态变量。请注意,由于编译器已内联该函数,因此它也可以优化第二次测试,因为知道该标志仅在第一次调用时进行测试。

标志似乎位于地址 0x00403374,并占用一个字节,而变量本身位于地址 0x00403370。

关于c++ - MSVC 如何优化静态变量的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3834620/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com