我听说std::function
的成本比auto
更重要,以处理lambda函数。有效的现代c ++ item5。我想要的是澄清std::function
使用更多内存而不是auto
的一些示例代码的机制。
有人能帮助我吗?
修改
class Widget {
public:
Widget(int i) : i_(i) {}
bool operator<(const Widget& o) { return o.value() > i_; }
int value() const { return i_; };
private:
int i_;
int dummy_[1024];
};
int main() {
// performance difference between auto and std::function
{
auto less1 = [](const auto& p1, const auto& p2) {
return *p1 < *p2;
};
std::cout << "size of less1: " << sizeof(less1) << endl;
function<bool(const std::unique_ptr<Widget>&,
const std::unique_ptr<Widget>&)>
less2 = [](const std::unique_ptr<Widget>& p1,
const std::unique_ptr<Widget>& p2) {
return *p1 < *p2;
};
std::cout << "size of less2: " << sizeof(less2) << endl;
{
// auto
std::vector<std::unique_ptr<Widget>> ws1;
for (auto i = 0; i < 1024*100; ++i) {
ws1.emplace_back(new Widget(std::rand()));
}
auto start = std::chrono::high_resolution_clock::now();
std::sort(ws1.begin(), ws1.end(), less1);
auto end = std::chrono::high_resolution_clock::now();
cout << ws1[0].get()->value() << " time: " << (end - start).count() << endl;
}
{
// std::function
// 25% slower than using auto
std::vector<std::unique_ptr<Widget>> ws2;
for (auto i = 0; i < 1024*100; ++i) {
ws2.emplace_back(new Widget(std::rand()));
}
auto start = std::chrono::high_resolution_clock::now();
std::sort(ws2.begin(), ws2.end(), less2);
auto end = std::chrono::high_resolution_clock::now();
cout << ws2[0].get()->value() << " time: " << (end - start).count() << endl;
}
}
return 0;
}
来自https://github.com/danielhongwoo/mec/blob/master/item5/item5.cpp
我认为此代码显示使用std::function
比使用auto慢。但不是使用内存。我只想用一些真实的代码来证明它。
答案 0 :(得分:8)
std::function
可以存储任意可调用对象。因此,必须参与类型擦除才能存储任意类型的东西。在一般情况下,这可能需要动态分配,并且在operator ()
的每次调用时,它肯定需要间接调用(虚拟调用或通过函数指针调用)。
lambda表达式的类型是而不是 std::function
,它是一个定义了operator()
的未命名类类型(lambda的闭包类型)。使用auto a
来存储lambda会使a
这种类型的精确闭包类型没有开销。
答案 1 :(得分:0)
std::function
的存储成本为true。正如我在RHEL 64位计算机上测试的那样,它是32个字节,而lambda仅占用1个字节。但是为了提高运行效率,无法复制原始成本中的注释。
有了g++ -std=c++17 -O2
,我得到的std::function
比lambda快得多。使用g++ -std=c++14 -O2
,结果接近,但lambda仍然落后。
size of less1 as lambda: 1
size of less2 as function : 32
3722 time lambda sort: 47979086
6700 time function sort: 45291861