首页 > 解决方案 > Visual Studio 2019 map::operator[] 中的非合法优化?

问题描述

在迁移到 MSVC 2019 时,我发现std::map::operator[].

简而言之,编译器优化会在评估运算符右侧之前增加映射的大小。

小例子(用 MSVC 16.9.6 测试)

#include <iostream>
#include <map>
#include <chrono>

using Key = std::chrono::duration<double, std::ratio<1>>;
using Map = std::map<Key, size_t>;

void dummy(Map& map, Key key)
{
    map[key] = map.size();
}

int main() {
    Map map;
    dummy(map, std::chrono::seconds{ 1 });

    for (const auto& item : map) {
        std::cout << "key:" << item.first.count() << " value:" << item.second << std::endl;
    }
}

模式下的输出debug符合预期:

key:1 value:0

但是,release情况有所不同:

key:1 value:1

我错过了什么?或者那是不需要的?

至少,clang 的行为不一样:https ://godbolt.org/z/fE91M3xxe

谢谢,

标签: c++visual-studio-2019

解决方案


推荐阅读