普段は書いてるプログラムはほとんどLinux用だけど、Windows専用のソフトにJavaはちょっとかっこ悪い。普段はemacs一本だけど、VisualStudioも慣れれば悪くない環境です。 今は必死でATLを勉強してます。しかし.NETが普及してしまったら、この技術は役に立つのだろうか…
謎エラーの数々。
fatal error C1083: プリコンパイル済みヘッダー ファイルを開けません。 →ソリューション・エクスプローラの.cppファイルで右クリックの後、「プロパティ」で、[構成プロパティ] → [C/C++] → [プリコンパイル済みヘッダー] → [プリコンパイル済みヘッダーの使用/作成] で、「自動的に作成する(/YX」を選ぶ
.cppファイルを自分で作って、気分良くコード書いてたらこんなエラー。
warning C4103: ....cpp' : used #pragma pack to change alignment
VisualStudioでは、頻繁にincludeされるヘッダを予めプリコンパイルしておく機能が付いているらしい。このために用いられるのがstdafx.hで、共通してインクルードするファイルはここに書いて、しかも全てのcppソースはstdafx.hをインクルードしないといけないらしい。
#include "stdafx.h"
を全てのcppファイルの先頭に書いて解決。
error C2475: pointer-to-member の形成には明示的なアドレス演算子 ('&')
および限定名の使用が必要です。
クラスのメンバ関数を呼び出すときに、()を忘れている。 str.size()と書かないといけないのをstr.size 、とか。
Ctrl + spaceで補完候補が表示される
普通のプログラムは"Win32アプリケーション"
実行ファイル名の設定 : ツール→オプション→リンカ→全般→出力ファイル
VCでプログラムが遅い場合、まずはビルド構成が「Release」になっていることを 確認しましょう。メニューバーの「ツール」「ウィンドウ」の下あたりに「Release」とか 「Debug」とか表示されたプルダウンメニューがあるので、これから「Release」を選びます。 さらに、「プロジェクト」→「〜のプロパティ」(〜の部分はプロジェクト名が入ります) を開き、「構成プロパティ」「C/C++」で、「最適化」を選び、「最大限の最適化」にすると もっと速くなるかもしれません。
まずは体験版をダウンロードします。 http://www.intel.com/cd/software/products/ijkk/jpn/compilers/295809.htm メールアドレスを登録して、ライセンスキーを取得したら、 それを使ってインストールします。 インストールの画面が「Intel Debugger」「Intel Compiler」の二回出るので、 ちゃんと二つともインストールします。 その後、Visual Studioを起動し、メニューバーの「プロジェクト」メニューをクリックして 中身を見ると、"Convert to use Intel(R) C++ Project Systems"というメニューが 追加されています。これを選択してビルドすると、ICLを用いたバイナリが作成されます。 さらにICLの恩恵を受けるためには、最適化オプションを指定する必要があります。 「プロジェクト」「〜のプロパティ」でプロパティを開き、「構成プロパティ」 「C/C++」で、「コマンドライン」を選択します。「追加のオプション」として
/O3 /QxP /Qparallel
を指定します。/Qparallelがスレッド化、/QxPがベクトル化(MMXとかSSEとか?)です。 簡単なプログラムで性能を測定した結果を下に示します。 数字は実行時間(秒)です。 - Debug Release 並列化 ICC 2.6 0.6 0.1 VC++ (CL) 2.6 0.4 測定に用いたプログラムは以下です。
#include "windows.h"
#define N 100000
int _tmain(int argc, _TCHAR* argv[]){
int i, j,k;
int A[N];
int C[N];
LARGE_INTEGER freq, begin, end;
QueryPerformanceFrequency( &freq );
QueryPerformanceCounter( &begin );
for(i = 0; i < N; i++)
A[i] = i;
for(k = 0; k < 10; k++){
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
C[i] += A[i] + A[j];
QueryPerformanceCounter( &end );
printf( "%f¥n", ( double )( end.QuadPart - begin.QuadPart ) / freq.QuadPart );
}