BЈо*_*вић 3 c++ optimization lookup-tables
考虑到问题末尾的示例,每次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;
}
Run Code Online (Sandbox Code Playgroud)
在语义上和概念上以及与"圣标准"相关的每一次都会创造出来.
其余的由您的编译器以及您如何支持她:
可能编译器可以内联调用,然后将推断的不变量移出到单个初始化点.
可能编译器不喜欢你的函数有外部链接,因此没有内联它,然后很难看到来自其他函数的不变量.
可能编译器将始终检查变量constness并在它可以查看内部并验证boost::assign::map_list_of( A, "A" )( B, "B" )( C, "C" )
不会改变全局状态时使用一次性初始化.
许多因素,唯一可以确定的方法是查看生成的代码.
在回应报价请求时:
3.7.2.3 [basic.std.auto]:
如果命名的自动对象具有初始化或具有副作用的析构函数,则它不应在其块结束之前销毁,也不应作为优化消除,即使它看起来是未使用的,除了类对象或其副本可以按照"
这基本上意味着要么它有副作用,在这种情况下它不会被消除,或者它没有,在这种情况下它几乎不能在C++中被观察到; 这意味着有效:
观察到的行为总是好像每次都被调用一样.
换句话说:没有办法保证初始化只发生一次自动存储,所以永远不要假设相反.