42

空のクラスのサイズが 0 にならない場合、どの魔法が std::tuple を実行しているので、unique_ptr の sizeof は 64 ビット マシンで 8 を返しますか?

unique_ptr では、メンバーは次のように定義されます。

  typedef std::tuple<typename _Pointer::type, _Dp>  __tuple_type;                 
  __tuple_type  _M_t;

_Dp はデリータ クラスです。

コンパイラは gcc バージョン 4.7.1 (Debian 4.7.1-7)

4

2 に答える 2

62

その理由は、typename _Dp = default_delete<_Tp>が空のクラスであり、tupleテンプレートが空の基本クラスの最適化を採用しているためです。

unique_ptrデフォルト以外の削除でをインスタンス化すると、サイズが増加するはずです。

于 2012-11-19T19:23:26.177 に答える
39

unique_ptr指定されたとおりに実装するために必要な唯一のことは、生のポインターをコピー/移動するプロセスを変更することであるため、オーバーヘッドがゼロになる可能性があります。追加情報は必要ありません。したがってunique_ptr、ポインター以外のものを格納する必要はなく、ポインターと同じサイズにすることができます。

あなたの特定の実装がそれをどのように達成するかについて; ゼロより大きいサイズが必要なのは、ほとんどの派生型だけです。空の基本クラスは、0 バイトを占める場合があります。標準ライブラリの実装では、コンテナー内のステートレス アロケーターからタプルまで、あらゆる種類のものに対していわゆる「空の基本クラス」の最適化を利用することは非常に一般的です。

于 2012-11-19T19:21:59.863 に答える