- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注 this blog并试图将动态多态性代码替换为使用 std::variant
和 std::visit
。但是我无法让 std::variant
+ std::visit
比虚拟结构实现更好地工作。它大约慢 1.3-1.5 倍!(GCC 10.3 -O3 C++17)
用例如下。假设我们正在比较两个表的第 i 行和第 j 行。一个表可以有不同类型的列。假设我们可以访问列缓冲区。我正在做的是测试,
def IndexEqual(Table:A, Table:B, int:i, int:j):
for c in range(A.num_cols):
if not A.column(c)[i] == B.column(c)[j]:
return False
return True
对于动态多态性,我对 int
和 float
有以下内容
struct Comp{
virtual bool comp(size_t i, size_t j) const = 0;
};
struct CompI: public Comp {
CompI(const int *data_1, const int *data_2) : data1(data_1), data2(data_2) {}
const int *data1, *data2;
bool comp(size_t i, size_t j) const override {
return data1[i] == data2[j];
}
};
struct CompF: public Comp {
CompF(const float *data_1, const float *data_2) : data1(data_1), data2(data_2) {}
const float *data1, *data2;
bool comp(size_t i, size_t j) const override {
return data1[i] == data2[j];
}
};
bool IndexEqual1(const std::vector<Comp *> &comps, size_t i, size_t j) {
for (auto &&a: comps) {
if (!a->comp(i, j)) {
return false;
}
}
return true;
}
这被转换为 std::variant
+ std::visit
如下。
struct EqualToI {
EqualToI(const int *data_1, const int *data_2) : data1(data_1), data2(data_2) {}
const int *data1, *data2;
bool comp(size_t i, size_t j) const {
return data1[i] == data2[j];
}
};
struct EqualToF {
EqualToF(const float *data_1, const float *data_2) : data1(data_1), data2(data_2) {}
const float *data1, *data2;
bool comp(size_t i, size_t j) const {
return data1[i] == data2[j];
}
};
using var_type = typename std::variant<EqualToI, EqualToF>;
bool IndexEqual(const std::vector<var_type> &comps, size_t i, size_t j) {
for (auto &&a: comps) {
if (!std::visit([&](const auto &comp) {
return comp.comp(i, j);
}, a)) {
return false;
}
}
return true;
}
我在这里进行了基准测试 https://quick-bench.com/q/u-cBjg4hyQjOs6fKem9XSdW7LMs
有人可以解释为什么这个 std::variant
+ std::visit
选项比动态多态性方法慢吗?我的预期并非如此!我的方法和/或基准是否有问题?
最佳答案
使用variant
不构成“静态多态”。它仍然是动态多态性,因为编译器不知道哪种类型将实际驻留在 variant
中。因此,有问题的代码必须尝试找出 variant
在运行时存储的内容,并且必须相应地调度这些调用。
请注意,您链接到的文章也 没有将其称为“静态多态性”。它强调它只是与虚函数不同的“运行时多态”形式。
关于C++17 std::variant 比动态多态慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69444641/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!