C++

新しい VC++ のコンパイラを試す

ツイッターを見てたら、Introducing a new, advanced Visual C++ code optimizer | Visual C++ Team Blogこんなのがありまして、へー、でも試すの面倒くさいなぁと思っていたらですね、Try out the latest C++ compiler toolset without waiting for the nex…

続続) 気づいたら、C# が C++ の速度を凌駕している!

先日の記事、espresso3389.hatenablog.com.NET Native だとどうよ?っていう話があったので、試してみました。 コードは趣旨を変更しない範囲で弄りました。 スレッドプールのプライオリティとかどうなってんの?っていう疑問はあるんですが、 実行した感じ…

気づいたら、C# が C++ の速度を凌駕している!

5年半程前に書いた、この記事。espresso3389.hatenablog.comC#というか、.NET Framework 4.6 は、 RyuJIT という新しい JIT の導入によって、64-bit 環境での実行が高速化されています。なので、さーて、少しは面白い結果が出るんじゃないかなぁーと。blogs.…

Visual Studio 2015 Update 1 で C++ <experimental/generator> を試してみる

C++

Visual Studio 2015 Update 1 のリリースノート関連を見ていたら、 Coroutine が動くぜ!っていう記事があったので試してみました。blogs.msdn.comコルーチンっていうのは、まぁ、C#でいう yield return で、C++でも yield っていうそのまんまの名前なんです…

Aero-Snap による Window サイズの変更を検出する

GetWindowPlacement では、ウィンドウが通常の状態でのウィンドウ座標と、実際にウィンドウが、最大化されている(SW_MAXIMIZE)のか、最小化されている(SW_MINIMIZE)のか、あるいは、通常の状態(SW_SHOWNORMAL)なのかが取得できます。従って、普通なら、この…

C#からネイティブDLLを呼び出す場合のVSからのデバッグのジレンマを解決する

「C#を使う最大のメリットって、やっぱり、Visual Studioですよね!」って自信を持って言いたいですね。という心境ではあるんですが、私の仕事はどっちかというとC++よりなので、どうしても、DllImportはお友達という側面があります。そうすると、プログラム…

Xamarin iOSのP/Invokeでコールバックを使うときの制限

C#でコードが書きたいという一心で、Xamarin iOSを使おうと考えているんですが、基本的に僕の各コードは、C/C++で基本的なAPIセットを用意して、それのラッパーをC#で書き、さらにそのラッパーを呼び出すコードをC#で書く or 書いて貰うという感じになります…

ndk-buildを使わないでプログラムをビルドする

普段は、ndk-buildでビルドをしているのが楽だし、便利なんですが、時に、外部のライブラリがconfigureとか使ってて、自前でAndroid.mkとかを作るのが面倒なことがあります。というか、試しに自前で作ってみようとしたけど、新旧の情報が錯綜しており、また…

Qt を試したけど玉砕した。

注意 下の作業をしたけど、あんまりうまくいきませんでした。玉砕です。 ただいま、いろいろ試行錯誤中ですが、自分用にメモとして書いておきます。 Qt のダウンロード 今回は、 http://qt.nokia.com/ から、Qt 4.7.0 (qt-sdk-win-opensource-2010.05.exe) …

C++とC# unsafeで速度差を計測してみる

何となく、unsafeコードの速度が気になったので、.NET Framework 4.0上でのC#コードと、Visual C++ 2010のコードの速度差を計測してみました。 ちなみに、このコードは、いわゆる画像処理の速度差を計測することを前提とするものなので、w/h/strideといった…

Win32のバージョンリソース

EXEファイルにバージョンリソースを書き込むコードを書こうとググって見たところ、意外にもあまりまともな記事が見つからなかったので、自分で書いてみた。基本的には、VERSIONINFO ResourceからMSDNの記事をたどって、全体構造を把握するだけなんだけれども…

ボリュームがマウントされているパスの一覧を取得する

FileSystemWatcherとか、ReadDirectoryChangesWは、ファイルの更新とかを監視するには便利な関数ですが、これらでサブディレクトリを監視するようにしても、サブディレクトリがマウントポイントで、他のボリュームが接ぎ木されているような場合にはそのマウ…

extern "C++"

Windows Driver Kit for Windows 7 and Windows Server 2008 R2をよく見ると、 extern "C++" というのがある。これは何ですか・・・。理屈から言うと、 extern "C" { // ここはC extern "C++" { // ここはC++ } } という感じで、入れ子にして、Cのコードの中…

超例外=メタデータ=コードが速くなるぜ理論

C++

例外原理主義 - TrickDiary超例外原理主義このナンセンス感、嫌いじゃないです。ただ、最近、何もかもがメタデータ(属性・アノテーション)に見える僕にとっては、別のアプローチの方がおもしろいのではないかと思う部分でもあります。 個人的には、assertと…

ユーザーに「サービスとしてログオン」権限を付与する

特定のサービスをユーザーアカウントで起動しようとすると、ユーザーにサービス権限がないことが問題になることがある。特にVistaでは、Administratorsに所属していてもこの権限がないので、いろいろとやっかいだ。これを解決するために、 // espresso3389と…

リモートプロセスのコマンドラインパラメータを取得する

自分のプロセスのコマンドラインを取得するのは非常に簡単だ。main関数が存在するならargc, argvで取得できるし、そうでなければ、__argv, __argv, (__wargv/__targv)で取得することもできる。また、APIとしては、GetCommandLineというものもある。好んで使…

ShellExecuteExで起動したアプリの制御

アプリを無理矢理動作させて、無理矢理印刷させるという、ある意味使い古されたスキームなんだけど、ウェブを探してもShellExecuteExを使った例は少ない。理由は簡単で、つい最近まで、プロセスハンドルから、プロセスIDを取得できなかったという簡単なこと…

WIC一覧の取得

上記の方法で、いろいろなファイルが読み込めることがわかったが、一方で、WIC経由で開くことのできる(はずの)ファイル形式の一覧がほしいことがある。端的に言えば、「ファイルを開く」ダイアログのフィルターを作ったりするときに、*.*では格好悪すぎる。 …

画像を保存

処理が完了した画像を保存するには、IWICBitmapEncoderを利用する。 IWICBitmapEncoderのインスタンス作成時には、WIC GUIDs and CLSIDsにあるGUID_ContainerFormat*の中から、自分が使いたいフォーマットのエンコーダを選択する。 // TIFFエンコーダを作成 …

カラーマネジメント

WICでは、カラーマネジメントシステム(CMS)の利用もかなり簡単になっており、これらは、IWICColorTransformを利用して行う。また、上記のサンプルで、IWICBitmapFrameDecodeがIWICBitmapSourceにキャスト(QueryInterface)可能だったように、IWICColorTransfo…

Windows Imaging Componentで画像を読み込む

Windows Imaging Component (WIC)は、.NET Framework 3.0でも利用されている画像処理のフレームワークで、Vistaでは標準インストールされており、Windows フォトギャラリーなどでも利用されているほか、Windows XPでも、.NET Framework 3.5をインストールし…

low-fragmentation heap

会社で開発しているアプリケーションで、プログラムの[閉じる]ボタンを押しても数秒間固まったままになるものがあった。別に、WaitForXXXObject(s)しているわけでもないし、そんなに重い処理をしている訳でもない。理由がわからないまましばらく放置していた…

Visual C++ 9.0のランタイム問題

Visual C++ 9.0を使って共有DLL(/MD)でビルドしたコードを配布しようとすると(C++/CLIを利用すると必然的にこの状況になる)、CRTのDLLを配布する羽目になるんですが、これには、3つの方法があることになっています。 vcredist_x86.exeを利用する この方法は…

仕様書をなぞった実装

「ソースコードがドキュメント足りえないのは訓練していないから」 - イトウ アスカ blog 5月という時期だけにこういう話はたくさんある。新人研修にはうってつけの話かもしれない。仕様書をなぞったようなコードを書くのは、単にそのプログラマがウブだから…

C++スーパープログラマになるための学習項目リスト

C++

4月は新入社員の季節です。うちの会社にも一人だけですが、中途採用の社員が入ってくる(C/C++の若干の知識あり)ので、その人に何を教えるべきか考えています。下記は個人的に教えたいなぁと考えている項目。 ポータブルなコード マクロ 64bit intよりsize_t …

Win32 File-ID APIs

Windows Vista/2008からは、File IDによるファイル処理が標準で実装されている。これは、NTFSとかでGetFileInformationByHandleを使って取得できるBY_HANDLE_FILE_INFORMATION::nFileIndex*と同じもの。ファイルIDがわかっていれば、IDとドライブ識別のため…

今の今までCreateProcessの第2引数の意味を勘違いしていた

今まで、 CreateProcess("hoge.exe", "arg1", ...); は、 argv[0] = "hoge.exe" argv[1] = "arg1" となると信じていて疑わなかったけど、実は、 argv[0] = "arg1" となることを今知り、愕然としました! 結局、UNIX系のプロセス開始システムコールとあまり変…

VC9で、__restrictを試す

C++

VC8(VS2005)以降では、ついに、__restrictがサポートされた。実質的にはC99にもあるrestrictと同じだ。 平たくいえば、特定のポインタについて、どこにもエイリアスがないよということを示すためのもの。 しばらく、盲目的に、__restrictを使ってコードを書…

C++/CLIで、genericなCollectionを自力で実装してみる

C++

.NET Frameworkには、Collectionというgeneric型のコレクションを作成するときに使える便利なクラスがある。このクラスは、書き込み方面の処理さえできれば問題ない場合には、 ClearItems InsertItem RemoveItem SetItem の4つのメソッドさえ実装すれば良い…

libjpeg, libpngのエラー処理

C++

libjpegやlibpngのエラー処理って、かなり醜いことになっていて、通常、Cだけでコーディングする場合には、setjmp/longjmpのお世話になってしまいます。で、そうすると、リソースリークなどの温床になることは必至で、個人的には大嫌いなものの一つです。こ…