【发布时间】:2022-11-24 18:19:08
【问题描述】:
我正在寻找 std::visit 的一些示例,我想探索一下以下常见示例代码:
#include <iostream>
#include <variant>
struct Fluid { };
struct LightItem { };
struct HeavyItem { };
struct FragileItem { };
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>; // line not needed in C++20...
int main() {
std::variant<Fluid, LightItem, HeavyItem, FragileItem> package(HeavyItem{});
std::visit(overload{
[](Fluid& ) { std::cout << "fluid\n"; },
[](LightItem& ) { std::cout << "light item\n"; },
[](HeavyItem& ) { std::cout << "heavy item\n"; },
[](FragileItem& ) { std::cout << "fragile\n"; }
}, package);
}
我已经用 GCC 和 MSVC 编译了代码,我注意到在最后一种情况下,生成的 ASM 代码量比 GCC 代码量大一个数量级。
Here the code compiled with GCC。
Here the code compiled with MSVC。
有没有办法知道为什么会有如此大的差异?有没有一种方法可以使用 MSVC 进行优化以获得类似于 GCC 的 ASM?
【问题讨论】:
-
我认为这里的默认输出具有误导性。尝试将对
std::visit的调用移动到一个单独的函数(例如visitor),关闭“编译为二进制”和“执行”,然后查看只是visitor函数。两者对我来说大小大致相同:他们检查一个标签并发送到一个分支机构,然后由该分支机构进行实际打印。 -
大多数 MSVC 代码是
iostream的初始化,在 GCC 程序集中,它隐藏在几个函数调用中
标签: c++ assembly visual-c++ compiler-optimization