c++ - 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# - Selenium IWebElement.Click() 无法间歇性工作
- javascript - Google OAuth2 登录始终要求用户访问权限
- sql - 在 oracle 中从日期格式转换为日期格式
- r - 如何编译 .f 文件而不会出现无法分类的语句和意外的文件结尾错误
- python - 在python for循环中创建多个json文件的问题
- arrays - 优化 SwiftUI 中的搜索以加载不滞后
- python - AttributeError: 'list' object has no attribute '_all_hypernyms' 这是什么错误?
- c# - 什么时候应该创建从 IEnumerator/IEnumerable 派生的类?
- javascript - 我正在尝试在 VISUAL STUDIO 中使用 javascript 创建一个搜索栏,但我还没有成功
- reactjs - React 应用程序中的 Axios。使用表单数据发布图像发送带有空正文的请求