funini.com kei Visual Studio .NET

Visual Studio .NET

Microsoft VisualStudio .NET

普段は書いてるプログラムはほとんどLinux用だけど、Windows専用のソフトにJavaはちょっとかっこ悪い。普段はemacs一本だけど、VisualStudioも慣れれば悪くない環境です。 今は必死でATLを勉強してます。しかし.NETが普及してしまったら、この技術は役に立つのだろうか…

エラーメッセージ

謎エラーの数々。


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 、とか。

Tips

VC (Visual Studio)のプログラムが遅い!

VCでプログラムが遅い場合、まずはビルド構成が「Release」になっていることを 確認しましょう。メニューバーの「ツール」「ウィンドウ」の下あたりに「Release」とか 「Debug」とか表示されたプルダウンメニューがあるので、これから「Release」を選びます。 さらに、「プロジェクト」→「〜のプロパティ」(〜の部分はプロジェクト名が入ります) を開き、「構成プロパティ」「C/C++」で、「最適化」を選び、「最大限の最適化」にすると もっと速くなるかもしれません。

Intel Compilerを用いた並列化

まずは体験版をダウンロードします。 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 );
}