Действительно ли идиома pImpl используется на практике? - PullRequest
156 голосов
/ 23 января 2012

Я читаю книгу "Исключительный C ++" Херба Саттера, и в этой книге я узнал об идиоме pImpl.По сути, идея состоит в том, чтобы создать структуру для private объектов class и динамически распределить их по , чтобы уменьшить время компиляции (а также лучше скрыть частные реализации).

Например:

class X
{
private:
  C c;
  D d;  
} ;

может быть изменено на:

class X
{
private:
  struct XImpl;
  XImpl* pImpl;       
};

, и в CPP определение:

struct X::XImpl
{
  C c;
  D d;
};

Это кажетсядовольно интересно, но я никогда не видел такого подхода раньше, ни в компаниях, где я работал, ни в проектах с открытым исходным кодом, которые я видел в исходном коде.Итак, мне интересно, этот метод действительно используется на практике?

Должен ли я использовать его везде или с осторожностью?И рекомендуется ли этот метод использовать во встроенных системах (где производительность очень важна)?

Ответы [ 11 ]

1 голос
/ 21 сентября 2016

Одно преимущество, которое я вижу, заключается в том, что он позволяет программисту довольно быстро выполнять определенные операции:

X( X && move_semantics_are_cool ) : pImpl(NULL) {
    this->swap(move_semantics_are_cool);
}
X& swap( X& rhs ) {
    std::swap( pImpl, rhs.pImpl );
    return *this;
}
X& operator=( X && move_semantics_are_cool ) {
    return this->swap(move_semantics_are_cool);
}
X& operator=( const X& rhs ) {
    X temporary_copy(rhs);
    return this->swap(temporary_copy);
}

PS: Надеюсь, я не неправильно понял семантику ходов.

...