C++プログラマ キャスブログ
[C++]newで作成したオブジェクト配列の要素数 2014年12月02日21:23:12
newで作成した配列の要素数を取得することが可能です。 ただし、オブジェクトにデストラクタが実装されていることが条件です。 ※全てのC++コンパイラで利用できるか不明なので自己責任でお願いします。 VCとGCCではいけました。 以下サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <cstdio> // printfに必要なヘッダー class A { public: virtual ~A(){} // デストラクタ }; int main() { // デストラクタのあるオブジェクトの配列作成 A* a = new A[10]; // 配列の先頭アドレスの4バイト手前に要素数が入っています。 printf( "%d\n", *((int*)a-1) ); delete[] a; return 0; }
出力 10
配列の先頭アドレスの4バイト手前に要素数が入っていることが分かります。 これでdelete[]を行った時に全てのデストラクタを呼ぶ仕組みが実現できるわけですね。
[Windows]libファイルをプロジェクトに追加する方法(VC) 2014年12月01日04:42:48
[プロジェクト(P)]->[プロパティ(R)]->[リンカー]->[入力]->[追加の依存ファイル]に 設定することでプロジェクトに追加が出来ます。 ※バージョンによって異なるかもしれません。筆者環境はVC2010です。 別の手段としてプログラムに埋め込むことも出来ます。 プロジェクトファイルに依存しないことが便利なのでこちらをオススメします。 // 書き方 #pragma comment( lib, "○○.lib" ) ○○.libの所に好きなライブラリを指定すれば追加できます。 同じlibファイルを多重で設定しても弊害がないので安心してご利用下さい。 簡単ですね。 使う際にはパスが通っていることをご確認下さい。 パスを通すには[プロジェクト(P)]->[プロパティ(R)]->[リンカー]->[全般]-> [追加のライブラリ ディレクトリ]に設定するのがいいと思います。 以下サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <cstdio> // printfに必要なヘッダー #include <windows.h> // timeGetTimeに必要なヘッダー //※mmsystem.hに定義されていますがwindows.hが無いと通らない場合があります。 // 必要なlibファイルの追加(timeGetTimeに必要) #pragma comment( lib, "winmm.lib" ) int main() { timeBeginPeriod(1); // 1msの精度に設定 printf( "%d\n", timeGetTime() ); timeEndPeriod(1); // 使い終わったらtimeBeginPeriodと同じ値を設定 return 0; }
上記の他に便利な使い方としては、自前のstaticライブラリやDLLを作成した時の ヘッダーファイルに#pragma comment( lib, "自作.lib" )が書いてあると パスを通すだけで使用できるのでよくやります。
[C#]文字列の加工にはStringBuilderを使いましょう。 2014年11月29日23:08:20
StringBuilderはバッファを確保して処理を行う為、文字列の連結時にメモリの再確保や コンストラクタ・コピーの処理を行わないのでstringで処理するより圧倒的に速いです。 私の環境では60倍程度差が出ました。 使い方はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // StringBuilder作成 // コンストラクタでバッファサイズの指定が可能です。 // 出来上がりの文字数を超える値を設定するとよいでしょう。 StringBuilder sb = new StringBuilder(1024); // 文字列の加工処理Appendメソッドを使います // 基本データ型やフォーマット文字列に対応しています。 sb.Append(true); sb.Append(10); sb.Append('a'); sb.Append(0.1f); sb.Append(0.2); sb.Append("hoge"); sb.AppendFormat("{0}aaa{1}", 999, "piyo"); // 文字列に変換 string result = sb.ToString(); // 完成した文字列(resultの内容) // True10a0.10.2hoge999aaapiyo
stringと時間比較用サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication { class Program { static void Main(string[] args) { // 時間計測用(ストップウォッチ) System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); // 結果保持用文字列 string result = ""; // 時間計測開始 sw.Start(); // ------------ StringBuilderを利用 ------------ StringBuilder sb = new StringBuilder(1024); for (int i = 0; i < 1024; ++i) { sb.Append("a"); } // 文字列に変換 result = sb.ToString(); // 時間計測終了 sw.Stop(); // 結果を表示する Console.WriteLine(sw.Elapsed.TotalMilliseconds); result = ""; // 時間計測開始 sw.Start(); // ------------ stringを利用 ------------ for (int i = 0; i < 1024; ++i) { result += "a"; } // 時間計測終了 sw.Stop(); // 結果を表示する Console.WriteLine(sw.Elapsed.TotalMilliseconds); } } }
出力 0.0399 2.0726 CPU:Genuine Intel(R) U1400 @1.2GHz ※ショボイPCでごめんなさい。
余談ですがJavaではStringBufferというクラスです。 C#の前身である言語Delphiの同一機能がTStringBuilderというクラスなので影響を受けて いるのでしょうが、納得できません。 メジャーな言語にあわせて欲しいものです。
カテゴリ

リンク
C++11のコードを
試すのに便利です。
http://ideone.com/

同人ゲームを
製作している知人
sorcery

にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村


C++ ブログランキングへ

ゲームダウンロード DefenceTri