STL の勉強をするために Visual Studio 2015 の std::map をコードレーディングした時のメモ。
_Tree
にアルゴリズムの実装がある。(ヘッダーファイル xtree)- アルゴリズムは赤黒木。
_Tmap_traits
がキーを使って比較するための関数オブジェクト。_Tmap_traits
を噛ませることで実際の木の実装と,内部オブジェクトの分離を図っている。- 高速化やデバッグコードの分離のために複数のイテレーターが存在する模様。
STL の勉強をするために Visual Studio 2015 の std::map をコードレーディングした時のメモ。
_Tree
にアルゴリズムの実装がある。(ヘッダーファイル xtree)_Tmap_traits
がキーを使って比較するための関数オブジェクト。_Tmap_traits
を噛ませることで実際の木の実装と,内部オブジェクトの分離を図っている。make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない
がイマイチしっくり来なかったので、自分でコード作る+make_shared
のコードを追いかけて理解したので、
それのメモ。
以下のようなコードをメモリ使用量を監視しながらステップ実行して確かにそのようなことを起こっていることを確認出来た。
#include <array> | |
#include <iostream> | |
#include <memory> | |
using namespace std; | |
struct BigData { | |
std::array<char, 100000000> data; | |
}; | |
int main(void){ | |
{ | |
std::weak_ptr<BigData> weak; | |
{ | |
auto num = std::make_shared<BigData>(); | |
weak = std::weak_ptr<BigData>(num); | |
double sum = 0; | |
for (int i = 0; i < 100000000; ++i) sum += num->datai; | |
cout << "Create weak pointer." << endl; | |
cout << "Sum: " << sum << endl; | |
} | |
cout << "Weak pointer size: " << sizeof(weak) << "MB" << endl; | |
} | |
cout << "Weak pointer destroyed." << endl; | |
return 0; | |
} |
というわけで、どうしてそうなっているのかをソース追いかけてみる。 そうすると内部で、
_Ref_count_obj<_Ty> *_Rx =
new _Ref_count_obj<_Ty>(_STD forward<_Types>(_Args)...);
と内部オブジェクトを作っているようだが、事実上これが shared_ptr
の中身だと思って良さそうだ。
で、実際にそのコンストラクタのコードがこんな感じ。
template<class... _Types>
_Ref_count_obj(_Types&&... _Args)
: _Ref_count_base()
{ // construct from argument list
::new ((void *)&_Storage) _Ty(_STD forward<_Types>(_Args)...);
}
つまり、placement new を使って _Ref_count_obj
の中に、そのままオブジェクトを構築していることになる。
この _Ref_count_obj
は _Ref_count_base
を継承しているが、これが参照カウンタを持っている。
管理用のカウンタとオブジェクト本体が一緒になっているので、
オブジェクトを参照している weak_ptr
と shared_ptr
がなくならなければオブジェクトが開放されないというのも納得である。
make_shared
の中ではメモリの確保回数を減らすためにこのような処理を行っている、ということがわかっていればそれほど難しい事ではなかった。
で定義されるフーリエ変換の結果を纏めておく。
split以外の環境名の直後に*を付けると、式番号が振られなくなる。
一つの数式を表示する。
例
\begin{equation}
a=b
\end{equation}
\begin{equation*}
a=b=c
\begin{equation*}
実際の表示
複数の数式を&記号の後の文字でそろえて表示する。
例1
\begin{align}
a &= b \\
&= c
\end{align}
\begin{align*}
d &= e + f \\
&= g - h
\end{align*}
実際の表示1
例2
\begin{align}
x &= y & X &= Y \\
x' &= y' & X' &= Y \\
x'' &= y'' & X'' &= Y \\
\end{align}
実際の表示2
複数の数式を整列せずに表示する。
例
\begin{gather}
a = b + c \\
c = d + e + f + g
\end{gather}
実際の例
一行に入りきらない数式を複数行に分割して表示する。
例
\begin{multline}
a=b+c+d+e+f+g+h+i+\\
j+k+l+m+n+o+p+q+r+\\
s+t+u+v+w+x+y+z
\end{multline}
実際の表示
他の環境の中で使うことで、複数行に跨がる数式を作ることが出来る。
equation 環境と合わせて使うことで、複数行に跨がりながら一つの数式番号しか与えないようなことも出来る。
例
\begin{equation}
\begin{split}
x_1 + y_1 &= a_1 \\
x_2 + y_2 &= a_2 \\
x_3 + y_3 &= a_3
\end{split}
\end{equation}
実際の表示
例
\begin{equation}
x^2 + 2x + 1 = 0 \notag
\end{equation}
\begin{equation}
(x + 1)^2 = 0 \tag{※}
\label{eq:star}
\end{equation}
\begin{equation}
(x - 1)^2 \neq 0 \tag*{式1}
\label{eq:dagger}
\end{equation}
\begin{equation}
x = -1 \qquad \text{\eqref{eq:star}から重解}
\end{equation}
実際の表示
数式の幅が実際に文字が置かれている分だけになる。
括弧で括りたい場合などに使う。
例1
\begin{equation*}
\left.
\begin{gathered}
&\nabla \times \boldsymbol{E} - \dfrac{\partial \boldsymbol{B}}{\partial t} = 0 \\
&\nabla \times \boldsymbol{H} + \dfrac{\partial \boldsymbol{D}}{\partial t} = \boldsymbol{i} \\
&\nabla \cdot \boldsymbol{D} = \rho \\
&\nabla \cdot \boldsymbol{B} = 0
\end{gathered}
\right\}
\quad \text{マクスウェルの方程式}
\end{equation*}
実際の表示1
AUCTeX を使うときに便利なコマンドを纏めておく。
C-c C-p C-p | 現在位置の図や数式のプレビュー状態を切り替え |
C-c C-p C-c C-p | 現在位置の図や数式のプレビューを削除 |
Denyhosts は ssh でのログインログを解析して、不正アクセスを検知すると自動的にそのユーザーからの ログインを拒否するように /etc/hosts.deny を書き換えるというものでした。
しかし Denyhosts は長い間放置されていたせいで、 Debian のパッケージから削除されてしまった模様です。 その関係で、Ubuntu 14.04 でも denyhosts が消されてしまいました。 Package denyhosts in Ubuntu Trusty Tahr is deleted: temporary or forever? というわけで、denyhosts から同等機能を持つ fail2ban に乗り換える事にしました。