【.NET】 C++/CLI について語ろうぜ 【最適】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/11(日) 23:54:01であろうC++/CLIについて語ろうぜ!
0237デフォルトの名無しさん
2005/11/25(金) 23:07:16C#って知ってる?
0238デフォルトの名無しさん
2005/11/25(金) 23:08:24なんか言ってることおかしくない?
解放って?
0239デフォルトの名無しさん
2005/11/25(金) 23:12:33値型は primary な型を作るためのものだから、int とかにデフォルト・コンストラクタや
ファイナライザを定義しないでしょ?
0240デフォルトの名無しさん
2005/11/25(金) 23:13:13値型は、初期化しによる初期化、代入などで、
memcpyが行われるだけでいいようなオブジェクトに使う。
定義できなかったと言うより、定義しないでいいものに使う。
0241236
2005/11/25(金) 23:15:45template <typename T,typename TAG>
value struct a
{
T *p;
a(TAG)
{
p = new T();//NativeC++のスマートポインタが使えないのでCLIなスマートポインタが必要ぽい
}
};
0242236
2005/11/25(金) 23:21:43参照型だとコピーコンストラクタいちいち用意するの面倒じゃん。
C++とC++/CLI両対応のソース書きたいので値型にしてる。
0243デフォルトの名無しさん
2005/11/25(金) 23:38:57.Netでは「クラスは参照型」となっているのだからいつか破綻する。
0244デフォルトの名無しさん
2005/11/25(金) 23:40:16コピーコンストラクタが必要ないから値型にしているのであって、
面倒だから参照型を使わないんじゃない。
0245デフォルトの名無しさん
2005/11/25(金) 23:41:57適切に選択した方がいいよ
0246デフォルトの名無しさん
2005/11/25(金) 23:56:47わざわざ値型で定義しようとするから、苦労しているだけだと思うが
0247デフォルトの名無しさん
2005/11/26(土) 08:19:50LLVMがgccに入りそうな勢いだなあ。
0248デフォルトの名無しさん
2005/11/28(月) 09:42:42なぜなのでしょうか?
value struct UseRef
{
explicit UseRef(int& in_i)
:i(in_i)
{}
int& i;
};
ref struct TestRef
{
int i;
UseRef r;
TestRef()
:r(i)
{}
};
0249デフォルトの名無しさん
2005/11/28(月) 13:52:01規定されていません。そのため、生成時に不定となる値の参照を型として保持できないと思われ
0250248
2005/11/28(月) 16:40:53ありがとうございます。
参照型でも試してみましたが、やはりだめみたいでした。
一度、GC Heapにgcnewしてそこからinterior reference?(int%)を取得することで
参照のように扱うことはできました。
どうも値型のメンバには値型かGcHeap(Cloneされる)しかおけないようです。
また、interior ptr|referenceのときもクラスのメンバにはできないようです。
0251デフォルトの名無しさん
2005/11/28(月) 18:05:460252デフォルトの名無しさん
2005/11/28(月) 22:05:15ref struct TestRef
{
int i;
UseRef r;
TestRef() : i(0), r(i)
{}
};
0253デフォルトの名無しさん
2005/11/29(火) 16:38:040254デフォルトの名無しさん
2005/12/01(木) 17:33:26普通のref class とvalue classで通るコードでエラーがでるんだけど
属性とかでなくコンパイラにはじかれてるのかな?
Int32 o_int(0);
Int32^ g_int = gcnew Int32(0);
Int32% r_int = *g_int;
//Int32^ rg_int = %r_int;//NG
//String o_str;//NG
String^ g_str = gcnew String("");
//String% r_str = *g_str;//NG
//String^ rg_str = %r_str;//NG
0255デフォルトの名無しさん
2005/12/02(金) 02:00:31perlみてー
0256デフォルトの名無しさん
2005/12/02(金) 03:41:080257デフォルトの名無しさん
2005/12/02(金) 07:44:32思いつきで拡張してるよね。
C++の世界では有名な人達がやっているんだが…
0258デフォルトの名無しさん
2005/12/02(金) 07:49:140259デフォルトの名無しさん
2005/12/02(金) 08:28:53http://staff.develop.com/slip/
http://blogs.msdn.com/slippman/
http://www.microsoft.com/presspass/press/2001/oct01/10-19lippmanpr.mspx
Herb Sutter
http://www.gotw.ca/
http://blogs.msdn.com/hsutter/
http://www.microsoft.com/presspass/press/2002/Mar02/03-13SutterPR.mspx
0260デフォルトの名無しさん
2005/12/02(金) 12:51:520261デフォルトの名無しさん
2005/12/02(金) 13:27:41漏れはあまり詳しくないんだが、そうか???本当にそうなのか???????
0262デフォルトの名無しさん
2005/12/02(金) 15:34:590263デフォルトの名無しさん
2005/12/03(土) 00:57:17良くも悪くもC++的っていう気はする。
0264デフォルトの名無しさん
2005/12/03(土) 11:30:30C++/CLIに至ってはなんでもありだ。実装の都合としか思えないものもある。
0265デフォルトの名無しさん
2005/12/03(土) 19:46:54↓
C++の衰退とC#の反映
0266デフォルトの名無しさん
2005/12/03(土) 20:47:05断言する
0267デフォルトの名無しさん
2005/12/03(土) 21:11:340268デフォルトの名無しさん
2005/12/03(土) 22:04:56それか!!
0269デフォルトの名無しさん
2005/12/04(日) 18:49:26別にC++に変な影響を与えないと思うけど
0270デフォルトの名無しさん
2005/12/04(日) 20:03:250271デフォルトの名無しさん
2005/12/04(日) 20:18:12そうだよ。
0272デフォルトの名無しさん
2005/12/04(日) 20:56:430273デフォルトの名無しさん
2005/12/04(日) 21:15:11まだまだ進化する。
0274デフォルトの名無しさん
2005/12/04(日) 21:41:25タスクマネージャーの「CPU使用率の履歴」みたいな動的な(?)グラフを出せるものを書きたいのですが
何から手をつければいいのか、全くわかりません。
アドバイスよろしくお願いします。
0275デフォルトの名無しさん
2005/12/04(日) 21:46:550276デフォルトの名無しさん
2005/12/04(日) 22:13:21とりあえず↓この本読め。
http://www.amazon.co.jp/exec/obidos/ASIN/4872331265/qid=1133701895/sr=1-1/ref=sr_1_10_1/249-6035794-3226728
0277デフォルトの名無しさん
2005/12/05(月) 09:58:09C99のマズイところでどんなとこ?
得に思い当たらないんだけど
0278デフォルトの名無しさん
2005/12/05(月) 11:34:16MFCとC++、C丼とC++、MC++とC++、C++CLIとC++、それぞれ結局別物と思われてるところも痛いけど。
0279デフォルトの名無しさん
2005/12/05(月) 11:43:350280デフォルトの名無しさん
2005/12/05(月) 15:13:070281デフォルトの名無しさん
2005/12/05(月) 15:30:500282デフォルトの名無しさん
2005/12/05(月) 18:32:19C++/CLIやmc++のプログラムと読んでいいかどうかによるけど、
そう呼んでいいなら使える。
0283デフォルトの名無しさん
2005/12/05(月) 18:41:23COMを使うしかないのでしょうか?
0284デフォルトの名無しさん
2005/12/05(月) 19:07:05具体例を挙げてわかるように質問してくれ。
0285デフォルトの名無しさん
2005/12/05(月) 19:10:17どういったオプションでつか?
0286283
2005/12/05(月) 19:33:39混合クラスにできないだけで、
別クラスにしておいて呼び出しは可能だったのね...
Marshalingできる時はしたほうがいいのかな
ttp://msdn2.microsoft.com/library/ms235282(en-US,VS.80).aspx
0287修正
2005/12/05(月) 21:25:490288デフォルトの名無しさん
2005/12/05(月) 22:45:230289デフォルトの名無しさん
2005/12/06(火) 03:01:26managed から nativeのモジュールを呼び出すことも
cl /MT /c submod.cpp
cl /clr mainmod.cpp submod.obj
native から managedのモジュールを呼び出すこともできる。
cl /clr /c submod.cpp
cl /MT mainmod.cpp submod.obj
0290デフォルトの名無しさん
2005/12/06(火) 07:34:090291デフォルトの名無しさん
2005/12/06(火) 10:52:010292デフォルトの名無しさん
2005/12/07(水) 23:15:01マネージならC#でよくね?
0293マイク ◆yrBrqfF1Ew
2005/12/07(水) 23:19:320294デフォルトの名無しさん
2005/12/08(木) 00:28:08C++から移植するのってどれぐらい工数かかるんだろうか・・・・
0295デフォルトの名無しさん
2005/12/08(木) 00:32:04あえてC#を覚えようとする気がしない。
VC++6&MFCでつれないWindowsアプリはない。
0296デフォルトの名無しさん
2005/12/08(木) 00:39:030297デフォルトの名無しさん
2005/12/08(木) 01:10:46機械語で作れないwindowsアプリはない。
0298デフォルトの名無しさん
2005/12/08(木) 01:24:49脳内で計算できない問題はない。
0299デフォルトの名無しさん
2005/12/08(木) 06:10:140300デフォルトの名無しさん
2005/12/08(木) 08:16:12俺も未だに機械語で書いてるよ
Cだとおせーから嫌だ
0301デフォルトの名無しさん
2005/12/08(木) 08:28:05なるほど、いろんなWindowsアプリさんたちが釣れるようでつね。
0302デフォルトの名無しさん
2005/12/08(木) 11:44:150303デフォルトの名無しさん
2005/12/08(木) 20:59:47C++は絶対に廃れないよ
しかも、デバイスドライバを書ける人は絶対に不可欠
C#やJAVAなんてモノが出来ても結局また
新たな言語が出てきて廃れるのは必至
0304デフォルトの名無しさん
2005/12/08(木) 21:14:47新しい言語の出現で全盛期より減ったとは言え、需要がなくなることはありえない。
0305デフォルトの名無しさん
2005/12/08(木) 21:44:190306デフォルトの名無しさん
2005/12/09(金) 02:03:110307デフォルトの名無しさん
2005/12/09(金) 11:02:38整えて欲しい。
printfやstrcmp使うとネイティブとの混合アプリになっちゃうんでしょ?
標準ライブラリの中も.NETにすりゃあいいのに。
0308デフォルトの名無しさん
2005/12/09(金) 11:24:490309デフォルトの名無しさん
2005/12/09(金) 13:12:07あなたは根本的にCLIの世界を理解してないです。
0310デフォルトの名無しさん
2005/12/09(金) 16:26:18混合だとWin以外に持っていけるの?(あるかはしらんけど)
あと、切り替え時に異様に遅い感触。
>>309
根本を教えてくれ
0311デフォルトの名無しさん
2005/12/09(金) 16:43:460312デフォルトの名無しさん
2005/12/09(金) 16:53:06/clrつけてコンパイルしなおしたプログラムが異様に遅い。
.NETにしてもちょっと遅すぎると思ってね。原因がネイティブ
部分の呼び出し負荷くらいしか思い当たらない。
0313310
2005/12/09(金) 17:37:18int a=0;
while(a++<200000000){
stricmp("abc","123");
}
ネイティブアプリだと1、2秒、CLIだと12秒くらいかかる。
stricmpをmy_stricmpに変えて、以下のように適当に定義してみると、
ネイティブでもCLIでも1、2秒で終わる。(my_stricmpは適当。要は
標準ランタイムを呼ばなければ良い)
int my_stricmp(const char*a,const char*b){
while(*a++==*b++){
if(a[0] == 0)
return 0;
}
return -1;
}
ちなみに、strcmpだとCLIでも1、2秒で終わるのだが、良く分からん。
strcmpだとCLIでもインライン展開されるのかな?
0315デフォルトの名無しさん
2005/12/09(金) 18:51:090316310
2005/12/09(金) 19:01:59my_stricmpを使ってネイティブと時間の差が無いのだから、
起動時間の問題じゃないと思う。
あと、ループの回数を増減させれば処理時間も比例する。
0317デフォルトの名無しさん
2005/12/09(金) 20:03:25strcmpは?stricmpだとCLIの方はロケールとかで色々面倒くさい
ことしてそう。
0318デフォルトの名無しさん
2005/12/09(金) 20:56:41ではlstrcmpはどう?
これなら絶対にインライン展開できない。
0319310
2005/12/09(金) 21:15:00lstrcmp,これから試してみるけど先に質問。
>>317に関して、
俺、やはり根本が分かって無い模様。strcmpは313に書いた通りなのだが、
stricmpの場合でも、CLIからネイティブと同じルーチンが呼ばれるもんだと
思っていた。
この前提で、中身が一緒なら呼び出してる部分に負荷があるんじゃないかと
思っていたわけだが、ネイティブとCLIで呼び出されるstricmp(に限らず標準
ライブラリ全般)は別物なの?
0320デフォルトの名無しさん
2005/12/09(金) 22:17:02その試した見たというコードをどこかのアップローダに晒すというのは
どうだい?そうすれば同じ土俵で話ができる。
0321310
2005/12/09(金) 22:54:16試してみた。lstrcmpの場合、ネイティブ37秒、CLI47秒だった。
lstrcmpこんなに重いのかというのはともかく、差がstricmpと
同じ。つーことはやはり呼び出し負荷でしょう。もちろんループ
回数も同じで測定している。
>>320
>その試した見たというコード
今までの数字は全部313のサンプルコードでの話。
mainかWinMainで囲ってちょうだい。
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, INT)
{
{
int a=0;
while(a++<200000000){
stricmp("abc","123");
}
}
return 0;
}
0322デフォルトの名無しさん
2005/12/09(金) 22:55:340324デフォルトの名無しさん
2005/12/09(金) 23:06:31> つーことはやはり呼び出し負荷でしょう。
それ言うなら、
> もちろんループ回数も同じで測定している。
回数変えてファクターが何か調べないと。面白い奴だな(w
0325310
2005/12/09(金) 23:10:53回数変えたら実行秒数が比例するけど。
my_stricmpにしてネイティブと差が無いわけだから、違いは
標準ライブラリの呼び出し以外に何か考えられる?
0326デフォルトの名無しさん
2005/12/09(金) 23:20:290327310
2005/12/09(金) 23:27:29何を言ってるのか分かりませんが、
具体的に他にファクターがあるならあげてみて欲しい。
こちらの比べ方に抜けがあるならそこを指摘してくれまいか。
0328デフォルトの名無しさん
2005/12/09(金) 23:31:27まぁ、とりあえず、時間の出たマシンのスペックを教えてちょ
問題になっているのは、msvcm80.dll 辺りかな
0329デフォルトの名無しさん
2005/12/09(金) 23:54:07325に比例するとは書いてあるけど、比例にもいろいろあるだろうに。
0330デフォルトの名無しさん
2005/12/10(土) 00:00:17比較のサンプルソースを出すね
C++/CLI
int main(array<System::String ^> ^args)
{
const char *buff = "buffer";
const char *check = "Test";
DateTime dt = DateTime::Now;
for ( int i=0; i<2000000; i++ )
{
//strcmp(buff,check);
mycomp(buff, check);
}
DateTime endTm = DateTime::Now;
Console::WriteLine("Time : {0}", endTm - dt);
return 0;
}
int mycomp(const char* before, const char* after)
{
while(*before++==*after++) if(before[0] == 0) return 0;
return -1;
}
これで、strcmp とmycompを切り替えるだけで、全然速度が違う。なじぇ?
0331デフォルトの名無しさん
2005/12/10(土) 00:19:190332デフォルトの名無しさん
2005/12/10(土) 00:28:24int mycomp(,,,) の前に #pragma unmanaged を置いてみるとどうなりますかね?
0333330
2005/12/10(土) 00:53:42before をちゃんとチェックすると、だいたい16秒でstrcmpと変わらない
むしろ、ネイティブだと一瞬なんで、処理に時間がかかる理由が気になる
0334330
2005/12/10(土) 01:08:50mycompにすると一瞬で終わるね。もうちょっと、関数の実装をちゃんとするべきなんだろうけど
ネイティブに記述された関数はネイティブで処理されてる。となると、C標準関数が問題
なのか・・・
0335310
2005/12/10(土) 08:50:45>回数を2倍にしても実行時間が2倍になるとは限らない。
それは比例じゃないと思うけど。
言葉どおり比例と受け取って欲しい。
だからループ外のファクターでは無いと思う。
>>334
マシンの速度が分からないけど、200万回のループで16秒もかかる?
あと、strcmpだとこちらではCLIでもネイティブと同じだった。
stricmp,lstrcmpで、ネイティブとの差が2億回のループで10秒。
差が同じなので、処理内容の問題でも無いと思う。
こちらのマシン速度は>>313です。
0336310
2005/12/10(土) 10:00:02言葉が足んなかった、すまん。ax+bのbの部分はごく小さいと思って欲しい。
>>332
試してみた。
CLIでmy_stricmpをunmanagedプラグマで囲ったら、少しだけ遅くなった(3秒くらい)。
囲わなかった場合、今朝計り直してみたら1秒未満。
■ このスレッドは過去ログ倉庫に格納されています