【发布时间】:2017-06-20 18:46:12
【问题描述】:
解释我正在尝试完成的最佳方法是使用此示例(使用Visual Studio 2008 SP1 编译):
struct ELEMENT1{
//Its members
ELEMENT1()
{
//Constructor code
}
~ELEMENT1()
{
//Destructor code
}
};
std::map<std::wstring, ELEMENT1> map;
std::pair<std::map<std::wstring, ELEMENT1>::iterator, bool> resIns;
ELEMENT1 element;
std::wstring strKey;
for(size_t i = 0; i < numberRepetitions; i++)
{
//Do processing
//...
//set 'strKey'
//Insert new element into the map first
resIns = map.insert(std::pair<std::wstring, ELEMENT1>(strKey, element)); //This line calls ELEMENT1 constructor & destructor twice
//Then fill out the data
fill_in_data(resIns.first->second);
}
BOOL fill_in_data(ELEMENT1& outInfo)
{
//Fill in 'outInfo' -- MUST be in its own function
//...
}
我的目标是优化这段代码,因此我做了以下工作:
将
ELEMENT1 element构造/破坏移到循环之外。我将
element插入map,然后尝试使用指向插入元素的指针填充它,而不是构造新元素,然后填充它,然后将其复制到地图中,然后将其销毁。 (至少这是计划。)
但是当我为 Release 构建编译它并检查汇编代码时,我可以看到带有 map.insert() 函数的 C++ 行调用了 ELEMENT1 构造函数两次!然后是其析构函数的两倍。因此,以下机器代码仅适用于 map.insert() 行:
所以我显然没有在这里看到任何东西。
有人可以建议编译后的代码中发生了什么以及是否可以对其进行优化?
【问题讨论】:
-
你能升级编译器吗?如果可以,那么您可以升级到 C++11 并使用为解决此问题而构建的
emplace。 -
@NathanOliver:不,现在升级编译器是不可能的。也许以后。
-
您的 std::pair 类型与 map::value_type 不匹配...
-
我是未来,您能否将屏幕截图中的信息以纯文本或代码格式的文本形式发布?
-
@MichaelBurr:我试过了。而且它看起来并不像在那个屏幕截图中那么好。 SO 格式化引擎完全毁掉了它。
标签: c++ windows visual-studio dictionary std