Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;性能:模板vs.boost.any_C++_Templates_Boost_Boost Any - Fatal编程技术网

C++ C++;性能:模板vs.boost.any

C++ C++;性能:模板vs.boost.any,c++,templates,boost,boost-any,C++,Templates,Boost,Boost Any,我想知道在任何可以使用模板的地方使用boost.any(没有RTTI)类是否会降低程序的速度。由于boost any实际上是一个围绕模板类的包装器,可以说,通过现代编译器优化,它将产生相同的效果,对吗 tpl_vs_any.hpp 速度:1794.54毫秒 #include "tpl_vs_any.hpp" int main() { test<tpl<double>>(); return 0; } #包括“第三方物流与任何.hpp” int main(

我想知道在任何可以使用模板的地方使用boost.any(没有RTTI)类是否会降低程序的速度。由于boost any实际上是一个围绕模板类的包装器,可以说,通过现代编译器优化,它将产生相同的效果,对吗

tpl_vs_any.hpp 速度:1794.54毫秒

#include "tpl_vs_any.hpp"

int main()
{
    test<tpl<double>>();
    return 0;
}
#包括“第三方物流与任何.hpp”
int main()
{
test();
返回0;
}
速度:1715.57毫秒

对它进行了多次测试,基本上都是相同的基准测试

那么,这样说是否正确:

test<any>();

与以下速度完全相同:

test<tpl<double>>();

假设您知道,就像编译器在第二个示例中所做的那样,boost::any仅在这种情况下用作double

不。目前的编译器远没有达到这种自省的程度<代码>增强::任何都会变慢


当然,您可以自己运行代码并找到答案。

boost::any
在内部拥有一个指向对象的指针,它使用
new
分配该对象。使
std::vector
大大快于(比如)std::list的一个原因是,vector在一次分配中将其所有对象保持在一个连续的存储中,这除了明显减少内存分配开销外,还对缓存更为友好

另外还有向分配中添加RTTI的细节,这通常是很小的开销,但是对于像
double
这样的非常小的类型,它会显著增加存储开销


boost::任何
都不是标准的一部分;它是特定模板的特定实现。因此,您不妨对其进行基准测试;没有其他竞争对手的“标准实现”。

boost.any执行类型擦除、RTTI和虚拟函数调度。它根本无法与直接静态编译的模板相比。std::cout您的基准测试时间很可能被写入标准输出所支配。还有,为什么您提到
boost::any
,然后不在任何基准测试中使用它?@David Brown class any是没有RTTI的boost::any的简化版本。我将做一个新的测试。我不太清楚RTTI是否无关紧要。“假设您知道,就像编译器在第二个示例中所做的那样,boost::any仅在这种情况下用作double”@Tim,这无法绕过分配,imo比RTTI更重要。但是,我认为您高估了编译器理解std::vector和boost::any内部发生的事情的能力。差别很小,请参阅我最新的性能分析。关于分配;我认为类越大,差异越小?@Tim,存储位置(缓存)效应在大向量上最为明显。可能大型物体也会减少差异;我通常更喜欢避免大对象的向量。(出列是一个很好的折衷方案。)在Stroustrup的2012 Gong Native keynote中有一些很棒的幻灯片,这里第43-48页:我认为keynote本身仍然可以观看。我希望vector的行为更像列表,而不是Stroustrup的基准中的vector。非常有趣和清晰的文章!谢谢你的反馈。
#include "tpl_vs_any.hpp"

int main()
{
    test<any>();
    return 0;
}
#include "tpl_vs_any.hpp"

int main()
{
    test<tpl<double>>();
    return 0;
}