使用智能指针多少钱,特别是boost :: shared_ptr在时间和内存方面与裸指针相比成本更高?对于游戏/嵌入式系统的性能密集型部分,是否更好地使用裸指针?您是否建议使用裸指针或智能指针来处理性能密集型组件?
解除引用智能指针通常是微不足道的,当然是为了提升发布模式.所有增强检查都在编译时进行.(智能指针理论上可以跨线程做聪明的东西).这仍然留下了许多其他操作.尼古拉提到建筑,复制和破坏.但这不是完整的集合.其他重要操作是交换,分配和重置为NULL.基本上,任何需要智能的操作.
请注意,某些智能指针会排除其中一些操作.例如,boost::scoped_ptr
甚至无法复制,更不用说分配了.由于这会减少操作,因此可以针对这些较少的方法优化实现.
事实上,随着TR1的出现,编译器很可能使用智能指针而不是原始指针做得更好.例如,编译器可以证明智能不可复制指针在某些情况下没有别名,仅仅因为它是不可复制的.想一想:当创建指向同一对象的两个指针时会发生别名.如果第一个指针无法复制,第二个指针最终会指向同一个对象?(也有办法解决这个问题 - 操作员*必须返回一个左值)
Boost提供不同的智能指针.通常,内存占用(根据智能指针的种类而变化)和性能都不应成为问题.有关性能比较,请查看http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smarttests.htm.
正如您所看到的,性能比较只考虑构造,复制和销毁,这意味着取消引用智能指针的成本应该与原始指针的成本相同.
以下代码段演示了使用a shared_ptr<>
代替原始指针不会造成性能损失:
#include#include int main() { #ifdef USE_SHARED_PTR std::tr1::shared_ptr i(new int(1)); #else volatile int * i = new int(1); #endif long long int h = 0; for(long long int j=0;j < 10000000000LL; j++) { h += *i; } std::cout << h << std::endl; return 0; }
处理性能问题的唯一方法是分析代码.无论如何,性能问题的最大部分是想象的; 只有剖析会指出你的瓶颈在哪里.
如果事实证明使用智能指针会产生原始指针不存在的瓶颈,请使用原始指针!在那之前,我不会过分担心它; 智能指针上的大多数操作都相当快.你可能经常比较字符串(或类似的东西),因为它们很重要.