C++性能:模板vs boost.any
C++ Performance: template vs boost.any
我想知道在任何可以使用模板的地方使用boost.any(没有RTTI)类是否会减慢程序的速度。由于boost-any实际上是一个围绕模板类的包装器,可以说,通过现代编译器优化,它会产生同样的效果,对吗?
tpl_vs_any.hpp
#include <iostream>
#include <vector>
using namespace std;
template<class T> class tpl
{
T content;
public:
tpl(const T& value) : content(value) {}
operator T() const
{
return content;
}
};
class any
{
public:
any() : content(0) {}
any(const any& other) : content(other.content -> clone()) {}
template<class T> any(const T& value) : content(new holder<T>(value))
{
}
~any()
{
delete content;
}
class placeholder
{
public:
placeholder() {}
virtual placeholder* clone() const = 0;
};
template<class T> class holder : public placeholder
{
public:
T content;
holder(const T& value) : content(value) {}
~holder() {}
placeholder* clone() const
{
return new holder<T>(content);
}
};
template<class T> operator T () const
{
return dynamic_cast<holder<T>*>(content)->content;
}
placeholder* content;
};
template<class T> void test()
{
for (int i = 0; i < 10000; ++i)
{
vector<T> a;
a.push_back(23.23);
a.push_back(3.14);
double x = (double)a[0];
}
}
那么说是正确的吗
test<any>();
与一样快
test<tpl<double>>();
假设您知道,就像编译器在第二个例子中所做的那样,boost::any
在这种情况下只用作双精度?(任何类别都没有RTTI)。
我更想知道支持和反对这篇论文的论据。
此外,在特定情况下,这些方法之间是否存在差异?
编辑:性能测试2:
- 示例1:1966.57 ms
- 示例2:1320.37毫秒
似乎有一个相对较大的差异。
编辑2:由于将主数据类型double
与类any
进行比较是不公平的,我进行了一个新的测试:
#include "tpl_vs_any.hpp"
int main()
{
test<any>();
return 0;
}
速度:1794.54ms
#include "tpl_vs_any.hpp"
int main()
{
test<tpl<double>>();
return 0;
}
速度:1715.57ms
对它进行了多次测试,基本上是相同的基准测试。
那么说是正确的吗
与一样快
假设你知道,就像编译器在第二个例子中所做的那样,boost::any在这种情况下只用作double?
否。当前的编译器远没有达到那种程度的内省。CCD_ 4将较慢。
当然,您可以运行代码,然后自己查找。
boost::any
在内部保存一个指向对象的指针,该指针与new
一起分配。使std::vector
比std::list
快得多的一点是,vector在一次分配中将其所有对象都保持在一个连续的存储中,这除了明显减少了内存分配开销外,还对缓存友好得多。
还有向分配中添加RTTI的细节,这通常是微不足道的开销,但在像double
这样非常小的类型的情况下,会显著增加存储开销。
boost::any
不是标准的一部分;它是一个特定模板的特定实现。因此,您不妨对其进行基准测试;没有一堆其他相互竞争的"标准实现"。
相关文章:
- boost::any 如何检查空值/未定义的值
- 在可变参数模板函数中存储参数而不使用 boost::any
- 将动态分配对象传递到 boost::any 构造函数中
- 标准::键映射和/或 boost::any 类型的值的类型检查
- 我如何知道 boost::any 是否包含文字字符串
- “boost::any”和“std::any”之间的区别
- 为什么这种类型的擦除实现(简化的 boost:any)会出现分段错误
- 确实 boost::any / std::any 将小对象存储到位
- C++性能:模板vs boost.any
- 将“ double*”转换为“ boost :: Any*”
- QVariant vs boost::any vs boost::variant
- 正在添加 boost::any in a boost::p roperty_tree 可能
- 无法将Boost.Any对象传递到C++Lua绑定
- 生成 Wt 项目时出错。无法打开包含文件:'boost/any.hpp'
- 在其他模板中使用 Any 类(类似于 boost::any)
- 为什么 boost::any 不保存字符串文字
- 获取 void* 指向 boost::any 内容的指针
- 将 boost::any 转换为 boost::variant 的通用函数
- 如何打印 boost::any 的向量,当我将元素类型存储在另一个字符串向量中时
- 获取指向 boost::any::operator= 的指针