Yip*_*Yay 13 c++ optimization assembly static visual-c++
我对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;
}
Run Code Online (Sandbox Code Playgroud)
这是代码的程序集(使用优化编译):

我感兴趣的主要领域是最后一个案例.
这里,第一个语句得到了全面优化,第二个语句的两个调用被内联,它们实际上代表了类似的代码块.
如果测试不成功,它们中的每一个都会test something something然后缩短jump(这些跳跃显然指向相应例程的结束).
如果第一次调用该函数,编译器是否对每个函数调用进行显式检查?
编译器实际上是否有一个flag,表明这是否是第一次调用该函数?
它存放在哪里(我想所有的test东西都是关于它的,但我不确定)?
是的,编译器必须添加一个隐藏标志来测试它是否是第一次调用函数并初始化或取决于该函数.在两个片段中,它都在测试标志,如果它被提升,它将跳转到函数的末尾,否则它将初始化静态变量.请注意,由于编译器已内联函数,因此可以优化第二次测试,因为知道该标志仅在第一次调用时进行测试.
该标志似乎位于地址0x00403374,并且占用一个字节,而变量本身位于地址0x00403370.
| 归档时间: |
|
| 查看次数: |
1901 次 |
| 最近记录: |