【问题标题】:c++11 - Performance difference in pointer checking - smart pointers [closed]c++11 - 指针检查的性能差异 - 智能指针 [关闭]
【发布时间】:2014-09-30 13:35:07
【问题描述】:

测试智能指针有什么区别吗? shared_ptr,使用operator bool

if (!smart_ptr)
{
    // ...
}

并使用operator == ?

if (smart_ptr == nullptr)
{
    // ...
}

我知道差异会很小(如果有的话),但它也有助于同时决定编码风格。

【问题讨论】:

  • 我认为使用体面的编译器差异将为零。在我看来,if (!smart_ptr) 更紧凑,也更富有表现力。
  • 如果现代编译器在优化的构建中没有为两者生成相同的代码,我会感到惊讶。 (最佳方式当然是结构化您的代码,这样您就根本不需要空检查。)风格方面,两者都很常见。如果您独自工作,请选择一种风格,但对另一种风格保持舒适。如果你在一个团队中工作,就一种风格达成一致并坚持下去。
  • 重申@AntonSavin, if(!ptr) 更惯用;它也与 optional 以相同的方式工作(它使用第一种检查方式作为首先采用类似指针的语法的动机)。
  • @StefanAtev:关于可选的很好的说明,我会记住这一点。
  • 能否请有经验的人告诉我如何才能使这个问题更具体?在我看来,我问过两种测试特定实体的方法有什么区别,我不知道如何改进。

标签: c++ c++11 coding-style


【解决方案1】:

在 gccv4.8 中:

#include <memory>

bool is_empty(const std::unique_ptr<int>& p) {
  return p == nullptr;
}

产生汇编代码:

is_empty(std::unique_ptr<int, std::default_delete<int> > const&):
    cmpq    $0, (%rdi)
    sete    %al
    ret

#include <memory>

bool is_empty2(const std::unique_ptr<int>& p) {
  return !p;
}

产生汇编代码:

is_empty2(std::unique_ptr<int, std::default_delete<int> > const&):
    cmpq    $0, (%rdi)
    sete    %al
    ret

因此,它在一个像样的现代编译器中没有任何区别。

Live Demo by Jonathan Wakely

【讨论】:

  • 据我了解,asm 只是 return 0...
  • 是的,你的代码已经被过度优化了:gcc 编译器已经证明你的指针从未被初始化,所以它把它当作一个常量表达式。尝试根据ARGC 或其他东西有条件地初始化它。
  • 固定:goo.gl/O3qYfB -- 两种形式仍然相同
  • @JonathanWakely 谢谢我正在尝试一个更复杂的例子,我会采用你的
  • @Jarod42 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多