其他分享
首页 > 其他分享> > c – 是否优化了std :: map table初始化?

c – 是否优化了std :: map table初始化?

作者:互联网

考虑到问题末尾的示例,每次调用函数GetName()时是否会创建映射对象?
或者创建是否会被优化并创建为一些查找表?

#include <iostream>
#include <sstream>
#include <map>
#include <string>
#include <boost/assign/list_of.hpp>

enum abc
{
    A = 1,
    B,
    C
};

std::string GetName( const abc v )
{
    const std::map< abc, std::string > values =
        boost::assign::map_list_of( A, "A" )( B, "B" )( C, "C" );
    std::map< abc, std::string >::const_iterator it = values.find( v );
    if ( values.end() == it )
    {
        std::stringstream ss;
        ss << "invalid value (" << static_cast< int >( v ) << ")";
        return ss.str();
    }
    return it->second;
}

int main()
{
    const abc a = A;
    const abc b = B;
    const abc c = C;
    const abc d = static_cast< abc >( 123 );

    std::cout<<"a="<<GetName(a)<<std::endl;
    std::cout<<"b="<<GetName(b)<<std::endl;
    std::cout<<"c="<<GetName(c)<<std::endl;
    std::cout<<"d="<<GetName(d)<<std::endl;
}

解决方法:

在语义上和概念上以及与“圣标准”相关的每一次都会创造出来.

其余的由您的编译器以及您如何支持她:

可能编译器可以内联调用,然后将推导出的不变量移出外部
到单点初始化.

可能编译器不喜欢你的
函数有外部链接,所以没有内联,然后很难
看到来自其他功能的不变量.

编译器可能总是检查变量constness并使用一次性初始化
当它可以查看内部并验证boost :: assign :: map_list_of(A,“A”)(B,“B”)(C,“C”)
不会改变全球状态.

许多因素,唯一可以确定的方法是查看生成的代码.

在回应报价请求时:

3.7.2.3 [basic.std.auto]:

If a named automatic object has initialization or a destructor with side effects, it shall not be destroyed before the end of its block, nor shall it be eliminated as an optimization even if it appears to be unused, except that a class object or its copy may be eliminated as specified in”

这基本上意味着要么它有副作用,在这种情况下它不会被消除,或者它没有,在这种情况下它几乎不能在C中观察到;这意味着有效:

观察到的行为总是好像每次都被调用一样.

换句话说:没有办法保证初始化只发生一次自动存储,所以永远不要假设相反.

标签:lookup-tables,c,optimization
来源: https://codeday.me/bug/20190903/1796414.html