C++/CLI part3

このエントリーをはてなブックマークに追加
936デフォルトの名無しさん:2010/01/26(火) 22:32:56
>>935
ええー。今時、WindowsでGUIを書くのにC++を使うなんて、マゾとしか思えん。
逆ならわかるがねぇ。
GUIをC#で書いてモデルや下回りをC++でってなら。
937932:2010/01/26(火) 22:36:49
すまん枠描くのはControlPaintだった
よっぽど深い相互運用しない限りはexport/DllImportの手間を差し引いてもC#の方が楽だし
安全だし取り回ししやすいよ
938935 :2010/01/26(火) 22:44:13
>>936-937
むう、再検討します。
939デフォルトの名無しさん:2010/01/26(火) 22:58:32
いわゆる普通の ウィンドウ枠は WS_BORDER だぞと。
普通は CreateParams オーバーライドして Style プロパティに
WS_BORDER のビットフラグ立てたのにするだけ。
3D 枠とかも基本は一緒な
940デフォルトの名無しさん:2010/01/26(火) 23:04:22
いやWindowsネイティブのコントロールに対応しない独自描画のカスタムコントロールの場合は
枠も自分で描くべき
標準のコントロールもそうなってる
941デフォルトの名無しさん:2010/01/28(木) 10:27:29
そもそもコモンコントロールだってただの画像だしな
942デフォルトの名無しさん:2010/01/29(金) 00:20:52
C++/CLI と C# embedded C++ どっちがいい?
943デフォルトの名無しさん:2010/01/29(金) 00:48:20
3択な上に比較対象がおかしい。
944デフォルトの名無しさん:2010/01/29(金) 02:04:59
何がしたいのかも判らんのに「どれがいい」も糞もないけどな。
WM (CE) の話で C++/CLI or C# or eVC++ のどれか、っていうなら
…いや、やっぱり好きにしろとしか言えないw
945デフォルトの名無しさん:2010/01/29(金) 02:46:25
(C++ in C#) の意味では?
946デフォルトの名無しさん:2010/01/29(金) 09:39:46
>>942-943
ワロw
947デフォルトの名無しさん:2010/01/31(日) 03:31:10
これからはC++0x/CLIの時代だろ
948デフォルトの名無しさん:2010/01/31(日) 05:14:01
敵はObjective-C++0xだな
949デフォルトの名無しさん:2010/01/31(日) 06:53:39
今までC++とC#ばかりいじくっていたが、Google様にお伺いを立てると
実行速度は

C++ > C++/CLI > C#, VB.NET らしい

C++/CLIの方が効率よく高速なMSILに変換される仕組みでもあるのかな?
950デフォルトの名無しさん:2010/01/31(日) 11:12:50
無いし実際同じ
951デフォルトの名無しさん:2010/01/31(日) 11:22:21
C++/CLI はネイティブコードで書いた部分の実行速度が速いからとかじゃ?
952デフォルトの名無しさん:2010/01/31(日) 11:38:51
ボックス化された値型とかトラッキング参照とか駆使して低レベルな最適化をやれば速くなるかもしれないけど
JITのバージョンアップであっさり逆転したりしそうだ
953デフォルトの名無しさん:2010/01/31(日) 22:47:30
検証に使用したコードがないと話にならんだろ。
954デフォルトの名無しさん:2010/01/31(日) 22:51:54
C#よりもC++/CLIの方ができることの制限が少ないから、速いコードを書くこと余地は大きいだろうね。
C++はUnsafeだから、こういうのを単純に比較しても意味ないと思うんだけどな。
955デフォルトの名無しさん:2010/01/31(日) 23:03:35
一般に将来的な最適化の妨げになるしなあ
956デフォルトの名無しさん:2010/02/01(月) 03:06:48
C++/CLIの速さはこの2つを足して2で割ったところとしているんでしょ。
マネージ部分の速さ = C#, VB.NET
ネイティブ部分の速さ = C++
957デフォルトの名無しさん:2010/02/01(月) 09:17:41
まあアンマネージだけで書いたらC++もC++/CLIも変わらんわな
マネージだけで書いたらC++/CLIもC#も変わらんわな

測ってないけど
958デフォルトの名無しさん:2010/02/01(月) 10:42:19
くだすれ落ちているのでここで失礼します。

unmanagedなバイト配列(unsigned char* byteArray, int len)を
managedな配列(array<Byte>)に変換したいと考えています。
とりあえずインデクサをつけて一個一個代入していったり、
Addしてみたりしたのですが、随分と処理に時間を喰ってしまいます。
そこまで速度に神経質なプログラムでも無いのですが、
もっとスマートに配列を変換する方法は無いものでしょうか。
959デフォルトの名無しさん:2010/02/01(月) 11:29:42
Marshal.Copy(IntPtr, byte[], int, int) とか。
960958:2010/02/01(月) 12:04:10
>>959
Marshal探せば良かったんですね。
Managedメモリを固定して確保してからmemcopyとか、明後日の方向に向かって努力していました……。
どうもありがとうございました。
961デフォルトの名無しさん:2010/02/02(火) 03:10:27
C++/CLIは/clr /clr:pureでは常にunsafeであり、
Cタイプの配列を使った場合のパフォーマンスが良い。1〜2割程度。
C++/CLIの暗黙のP/InvokeはSuppressUnmanagedCodeSecurityAttributeがデフォルトでオンなので、
C#のP/Invokeに対してパフォーマンスが良い。2〜3倍程度。
C#のP/InvokeにSuppressUnmanagedCodeSecurityAttributeを追加するとその差はなくなる。
またC++/CLIのリンク時に/CLRUNMANAGEDCODECHECKを付けると、
この属性がオフになるためパフォーマンスはC#と変わらなくなる。
962デフォルトの名無しさん:2010/02/02(火) 21:49:51
C#でも一応スタックに配列取ったりマネージ配列やアンマネージ配列にポインタでアクセスしたりできるよ
963デフォルトの名無しさん:2010/02/02(火) 22:10:43
マネージドで書いとけばいいのにやたらアンマネージド呼び出して
結果マーシャリングコストばっかりかかってパフォーマンス悪化とか、ありそうな話
964デフォルトの名無しさん:2010/02/11(木) 10:18:20
VS2010でインテリセンス外されたね
どうせ2008でもロクに機能してなかったし所詮ちょっとした橋渡しに使うだけだからどうでもいいけど
MSにとってのC++/CLIの優先度の低さは凄いな
965デフォルトの名無しさん:2010/02/11(木) 12:02:08
MS特有の言語なんて使う奴は馬鹿
966デフォルトの名無しさん:2010/02/11(木) 12:09:14
もともとから橋渡し専用言語だ
勘違いした奴が悪い
967デフォルトの名無しさん:2010/02/11(木) 12:39:38
J言語とかと同じような扱いだろ
968デフォルトの名無しさん:2010/02/11(木) 13:12:30
役に立たない機能ならなくなってもいい。
だがC++/CLI自体がなくなっては困る。
たとえ使う頻度が少なくても。
969デフォルトの名無しさん:2010/02/11(木) 13:20:35
.Netごとなくなればいいだろ
970デフォルトの名無しさん:2010/02/11(木) 14:03:10
MSがネイティブコード非推奨なら、unixと棲み分けができて丸く収まるんじゃないの
971デフォルトの名無しさん:2010/02/11(木) 15:48:04
思うんだけど
/clr:safeとかclr:pureだったりするとインテリの構文解析も
それほど手間がかからないと思うんだが。

STLとかほかのヘッダ使うときより
972デフォルトの名無しさん:2010/02/11(木) 15:50:57
それならC++/CLIなんかわざわざ使いません
973デフォルトの名無しさん:2010/02/11(木) 15:51:47
それだとC++/CLIあんまり使わないだろ。
974デフォルトの名無しさん:2010/02/11(木) 17:39:16
ネイティブいらないなら普通C#使う。
975デフォルトの名無しさん:2010/02/16(火) 01:32:21
あえてC++/CLIを使う必要があるのってどんな時だ?
976デフォルトの名無しさん:2010/02/16(火) 08:33:02
C++用ミドルウェアのC#用ラッパー作る時
977デフォルトの名無しさん:2010/03/06(土) 14:26:58
HOGEHOGE *hoge
open(&hoge)
ってやるとhogeを自動的に割り当てるCで書かれたDLLがあって

これを呼び出そうとしてるんだけど
マネージド側からHOGEHOGE*をどう渡せばいいのか分かりません

cli::interior_ptr<Type>' から 'HOGEHOGE **' に変換できません。
とか言われてます
978977:2010/03/06(土) 14:29:41
事故解決
979デフォルトの名無しさん:2010/03/07(日) 12:22:27
クラスメンバに定数を持たせるにはどうすれば?

Hoge.Func(Hoge.Options.Option1)みたいな

980デフォルトの名無しさん:2010/03/07(日) 12:28:43
literalかinitonlyで変数を宣言する
literalはコンパイル時定数でinitonlyは普通の読み取り専用フィールド
でもクラス外から見えるような定数をliteralにするのはバージョン管理上の問題があるので
.NETではなるべくinitonlyを使う
981デフォルトの名無しさん:2010/03/07(日) 13:14:06
public ref Class HOGE
{
public:
ref struct Options
{
literal Int32 Option1=1;
};
};

ってやるとInt32の前に;が必要ですとか言われます
調べた限りこれでいいと思うんだけどなんででしょう
982デフォルトの名無しさん:2010/03/07(日) 13:28:37
literal System::Int32 Option1 = 1;
983デフォルトの名無しさん:2010/03/07(日) 13:34:45
>>981
同じですね
コンパイラにliteralが認識されてないみたいです
青色になってるからIDEは認識してるみたいなんですけどね
なんか宣言とか要るんですか?
984デフォルトの名無しさん:2010/03/07(日) 13:44:27
ああ、原因が分かりました
C++のヘッダをincludeした所から下がunmanagedでコンパイルされてたみたいです
985デフォルトの名無しさん
それより>>979のような使い方をするならenum classにすればいいのに