|
|
[C++]クラスの中身が空でもサイズは1バイト |
2014年12月21日12:38:32 |
|
クラスの中身に何も書かなくてもサイズは1バイト取られます。
中身が空だといって油断しないようにしましょう。
クラスの配列を生成した時にアドレスを変える必要があるので
最小単位(1バイト)のメモリが確保されています。 |
1
2
3
4
5
6
7
8
9
10
11
12
| #include <cstdio>
class A
{
};
int main()
{
printf( "%d\n", sizeof(A) );
return 0;
} |
出力:
1 |
余談ですが、要素数0の配列は作れます。 |
1
2
3
4
5
6
7
8
9
10
| #include <cstdio>
int main()
{
int* i = new int[0];
delete[] i;
return 0;
} |
|
[C++]C++で書くシングルトンクラス |
2014年12月16日22:00:34 |
|
シンプルに書き表したシングルトンクラスです。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| class Singleton
{
private:
Singleton()
{
}
virtual ~Singleton()
{
}
public:
static Singleton* GetInstance()
{
static Singleton instance;
return &instance;
}
}; |
インスタンスの生成・解放を抑止するためにコンストラクタ・デストラクタは
privateに指定します。
問題はインスタンスを取得するためのGetInstanceメソッドです。
ガーベジコレクションが完備されている言語であれば、初回時のGetInstanceの内部で
newを利用してインスタンスを生成するのが一般的でしょう。
しかし、今回はガーベジコレクションの無いC++です。
newした場合、解放するタイミングを見失ってしまいます。
別途Releaseメソッドを設けるのもいいですがダサいです。
そこでstatic変数を利用してインスタンスを生成するのがいいことに気づきます。
これであればプログラム終了時に自動的に解放されることが約束されます。
参照カウンタ付きのスマートポインタを返すという手段も考えられますが
用途に対して大げさなので、static変数を使うので十分でしょう。
戻り値については、お好みに応じて参照を返すのかポインタを返すのかは
書き換えて頂ければいいのではないかと考えています。 |
|
[C++11]auto変数とconst_iterator |
2014年12月12日22:30:43 |
|
自動で型推論をしてくれるauto変数ですがイテレータを扱う時には注意が必要です。
auto変数はconst_iteratorなのか普通のiteratorか判別がつかないので
普通にbeginを書くとconst_iteratorにはなりません。
そこでC++11から追加されたcbeginを使えばconst_iteratorを返してくれます。
終端のconst_iteratorはcendです。普通に回す分には今まで通りendで問題ありません。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include <cstdio>
#include <array>
int main()
{
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
auto ite1 = arr.begin();
auto ite2 = arr.cbegin();
printf( "%s\n", typeid(ite1).name() );
printf( "%s\n", typeid(ite2).name() );
return 0;
} |
出力:
class std::_Array_iterator
class std::_Array_const_iterator |
const_iteratorを利用したループの書き方
※単純にループするだけならforeachをオススメします。
イテレータは削除や挿入が必要な場合に利用するのがいいと思います。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include <cstdio>
#include <array>
int main()
{
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
for( auto ite=arr.cbegin(); ite != arr.cend(); ++ite )
{
printf( "%d\n", *ite );
}
return 0;
} |
auto変数についての説明はこちら
[C++11]auto変数を使おう!ただし慎重に...
foreachについての説明はこちら
[C++11]イテレータとはおさらばforeach |
|
|