1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part94 toro.2ch.net/test/read.cgi/tech/1329512856/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.78【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1331894668/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
101 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:39:30.34 ] try { int x=-1; cin >> x; if (x<0) throw x; return x; } catch (int input) { cerr << input << endl; read_int(is); } でイケた。かっこよくね?
102 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:42:50.74 ] 初心者だからアホーなことしてたら指摘してほしいです。 こんなので大丈夫なのかしら・・・。
103 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:44:39.57 ] status = !status; これが右に偏ってる気がして気持ち悪いんだけど どうにかならない?
104 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:19:53.45 ] うん
105 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:30:41.25 ] intだと上のでいいのですが、 double x; cin >> x; の結果がよく分かりません。 stdinに数値でない"abc"を入れたときxは0にセットされるようなのですが、 doubleなのでx==0で判定するのも気持ち悪い。 cinが例外飛ばしてくれたりしますか?
106 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:36:01.98 ] 飛ばさねーよ
107 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:43:35.84 ] やっぱif(cin>>x)で判定して、自分で例外飛ばせばいいか。
108 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:51:53.96 ] ところで95で cin.ignore(1024,'\n'); としてる箇所ですが、INT_MAXとかを引数にしてもいいんですかね? 決め打ちを避けたいだけなんだけど。
109 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:56:45.82 ] >>105 std::cin.exceptions(std::ios::failbit | std::ios::badbit) ってやれば例外飛ぶよ。 cin に設定しちゃうと思わぬところで飛んで困るかもしれないけど。
110 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 09:03:59.04 ] >>109 へぇ、そんなのがあるんですね。 JavaだとデフォルトでIOException飛ばすから、コンパイル通すまで面倒だったりしますが。 >>108 numeric_limits<streamsize>::max() を第一引数に渡すのはやりすぎでしょうか?
111 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 09:20:10.07 ] >>107 C++設計者の例。 www2.research.att.com/~bs/bs_faq2.html の↓あたり。 while(cin>>d) v.push_back(d); // read elements if (!cin.eof()) { // check if input failed cerr << "format error¥n"; return 1; // error return }
112 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 11:08:35.52 ] 音声ファイルのパスSoundPathを受け取り、StartSampleからEndSampleまでの標本の値を調べ、 その区間の音量を返す関数を作ったのですが、現状ではwavファイルにしか使用できません。 mp3とoggにも使用できるようにしたいのですが、どのようにすれば可能ですか? int CBgm::VolumeMean(int StartSample,int EndSample,char SoundPath[]){ FILE* fp; errno_t err; short int LVol=0,RVol=0; int Ave=0; LONGLONG Sum=0; if((err=fopen_s(&fp,SoundPath,"rb"))!=0){ return 0; } fseek(fp,44+StartSample*4,SEEK_SET); for(int i=0;i<EndSample-StartSample;i++){ fread(&LVol,sizeof(LVol),1,fp); fread(&RVol,sizeof(RVol),1,fp); Sum+=MAX(abs(LVol),abs(RVol)); } if(EndSample-StartSample>0){ Ave=(int)(Sum/(EndSample-StartSample)); } fclose(fp); return Ave; }
113 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 11:34:52.67 ] 前もってユーザが自分でwavに変換するようマニュアルに書いておく
114 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:48:55.12 ] ま、ファイルから直接〜じゃなくて、一旦展開してから同じように調べるとかでいいんじゃね?
115 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:49:55.94 ] 適当なフリーの変換ツールでも呼べばいいんじゃね?
116 名前:デフォルトの名無しさん [2012/05/13(日) 09:05:43.48 ] class X { int a,b; inline int f() { return a+b; } int g() { return a+b; } int h(); inline friend int plus(X& x) { return x.a+x.b; } }; inline int X::h() { return a+b; } hの定義につけたインライン要請は意味があると思うのですが、 クラス内で定義しているfにつけたところで、何もつけないgとまったく同等なのでしょうか? あと同様にクラス内に書いたfriendについてもお願いします。
117 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 09:11:11.31 ] inline int X::h()これ以外全部意味がない
118 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 10:13:52.49 ] クラス定義内でメンバ関数・friend関数の定義を書いた場合、暗黙的にinlineがついてるものとみなされる
119 名前:デフォルトの名無しさん [2012/05/13(日) 13:42:41.18 ] Cのライブラリ(たとえばcstdlib)を使う場合に、 グローバルな名前空間を汚染させない方法ってありますか? namespace X { #include <cstdlib> } はコンパイルエラーになってしまうのですが・・・
120 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:14:33.20 ] >>119 無い。
121 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:18:36.79 ] どうせstdlib.hからcstdlibとか名前かえるくらいなら、 namespaceに入れてくれたらいいのに・・・ あるいはstatic includeみたいなのでも。
122 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:19:52.84 ] cstdlibを使うのなら汚染させないのは無理だと思うけどstd名前空間にも再宣言されているからstdで使う
123 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:29:45.35 ] >>119 関数に限れば、汚染を特定のコンパイル単位内に限定する方法なら有る 特定のコンパイル単位においてのみCのヘッダをインクルードし、 そこで適当なnamespaceを設定して同名のwrapperでも書き、他所のコンパイル単位からは 同名のwrapperの方を呼べば良い (※ printf()のような可変長関数の場合はwrapperからvprintf系を呼ぶ C++の関数シンボルは引数型とセットでマングルされるので、 仮にwrapper外(C++世界)のグローバル名前空間でCのライブラリに含まれるのと同名の関数を定義しても (extern "C" double ceil(double)等して明示的にCリンケージにしない限り)問題にならない
124 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:32:35.45 ] >>121 C++03 まではそのつもりで規格もそうなっていたけど、コンパイラベンダの反発(無視)が 何年も続いたため、 C++11 で規格のほうが現状を追認するようになってしまっている。 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456
125 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:43:32.30 ] >>122 なんという無意味な再宣言w コーディング規約として、そうするか・・・ >>123 負担が線形増大w けど参考になります。 >>124 ふむふむ、将来的にも予定はない・・・と。
126 名前:122 mailto:sage [2012/05/13(日) 14:51:25.13 ] >>125 こーやればいけたので報告 やっていいかどうかはわからないので詳しい人お願いします #include <iostream> namespace hoge { #include <cstdlib> using::atoi; } int main(void) { int a = hoge::atoi("4"); std::cout << a << std::endl; return 0; }
127 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:53:10.74 ] 結局リンクの段階でどうしても汚染されるので 無駄だよ
128 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:54:22.82 ] 汚染を防ぐじゃなくてstdじゃない名前空間で使うことね
129 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:03:15.52 ] それだけなら別にこれでいいじゃん #include <cstdlib> namespace hoge { using ::atoi; }
130 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:07:17.90 ] >>126 当然アウト。 17.6.2.2 [using.headers] p3 > A translation unit shall include a header only outside of any external declaration or definition, ...
131 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:16:09.34 ] >>126 GCC4.7でコンパイル通らないよ。
132 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:30:36.18 ] >>129 あーそうだね、ごめんなさい >>126 は忘れてください >>130 解説あり
133 名前:デフォルトの名無しさん [2012/05/13(日) 16:00:48.99 ] PODなら16byteの構造体に 多重継承でオペレータ関数を追加したら、28byteになってしまった。 多重継承にしたのは、他のクラスでも使うからで アップキャスト等する予定はありません。 これを多重継承ではなくコピペにしたら16byteのままのはずです。 ただ、コピペするとクラスのコードが長くなって、望ましくありません。 サイズを増やさずに、継承のように再利用出来る方法はありませんか?
134 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 16:31:46.26 ] >>133 C++でおk
135 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 17:08:52.40 ] >>134 はげどう >>133 C++でおk 多重継承で基底クラスと派生クラスのサイズが同じになるのが普通ジャネ、 みたいな質問をされると困惑するから具体例示せ
136 名前:860 [2012/05/13(日) 18:03:56.68 ] 試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。 --- struct A{ void f(){} }; struct B{ void g(){} }; struct C : public A { char a; }; struct D : public A, public B { char a; }; struct E : public A, public B { char a; void f(){} void g(){} }; size of struct C is 1 size of struct D is 2 size of struct E is 1 --- このDが2になるのは何で? 再利用性を損なわずEのように1にしたい。 メタプログラムは避けたい。
137 名前:133 [2012/05/13(日) 18:06:33.52 ] ※↑は間違いです。失礼 --- 試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。 --- struct A{ void f(){} }; struct B{ void g(){} }; struct C : public A { char a; }; struct D : public A, public B { char a; }; struct E : { char a; void f(){} void g(){} }; size of struct C is 1 size of struct D is 2 size of struct E is 1 --- このDが2になるのは何で? 再利用性を損なわずEのように1にしたい。 メタプログラムは避けたい。
138 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:22:49.23 ] >>137 codepad.org/Q4fuvcOb > size of C is 1 > size of D is 1 > size of E is 1 VC++2010EE の最適化が至らないといだけのことだな。
139 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:28:21.41 ] www.google.co.jp/search?q=msvc+multiple+inheritance+empty+base+class ↓ stackoverflow.com/questions/6119927/empty-base-optimisation-msvc ↓ https://connect.microsoft.com/VisualStudio/feedback/details/100686/empty-member-optimization-not-working-properly > 終了 > 解決策: 修正しない ... > 投稿者: Microsoft、投稿日時: 2006/04/11 11:50 > Hi: unfortunately even though this is a bug in the Visual C++ object > model we are unable to fix it at this time given that fixing it would > potentially break a lot of existing programs as the sizes of objects > would change. Hopefully in the future we may be able to address this > issue but not for the next release of the product.
140 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:32:38.27 ] 俺もその結論に達しました。 クラスは空であってもサイズは1。 ただし継承元が空の場合、最適化で0とすることが出来る。 しかし、VC++2010EEの場合、継承元が2つ以下の場合しか最適化が効かないようです。 残念、こういう結果になるとは。ともかくありがとうございました。
141 名前:デフォルトの名無しさん [2012/05/13(日) 19:18:04.32 ] int main(int argc, char* argv[]) { vector<string> arg(argv,argv+argc);//ここまでOKだよね? int res; while ((res=getopt(arg.size(),&arg[0],"a"))!=-1) { } } が通らない。 char* const*にconvertできないといって怒られる。 &arg[0]をc_strを指すポインタに変換しないといけない(?)ですが、 static_castで何とかなりますか?
142 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:20:05.07 ] ちなみに適当で static_cast<char*>(&arg[0]) とやってもダメ。
143 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:34:20.71 ] >>141 何がしたいの? getopt(argc, argv, "a") してから arg 作っちゃダメなの?
144 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:37:58.28 ] >>126 #include<c〜>でインクルードして グローバル名前空間に関数が展開されるのは規格違反 MSのクソコンパイラー以外じゃコンパイル出来んぞ
145 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:38:05.27 ] >>143 stringとvectorでラッパを作ろうと思って。
146 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:43:57.51 ] わざとヤッてるとしか見えんな
147 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:46:05.79 ] >>144 >>132
148 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:51:06.88 ] static_castはダメだけど、 reinterpret_cast<char**>(&arg[0])でイケた。 違いがわからんw
149 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:10:31.93 ] >>140 VC++2010EEつうか、Windows SDKにも入ってる MSのMicrosoft (R) C/C++ Optimizing Compilerの問題じゃね。 EEだろうがどのエディションでもコンパイラーは同じだから問題も同じ。
150 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:10:51.44 ] >>148 コンパイルは通るかもしれんが、イケてないよ。
151 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:11:34.63 ] >>145 >>143
152 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:15:55.15 ] >>148 int main( int argc, char *argv[] ) { //std::vector<std::string> arg(argv,argv+argc); この時点でダメ int res; while( ( res = getopt(argc, argv, "a") ) != -1 ) { } } getoptはchar**型を取るのであって、std::vector<std::string>を取れるように出来ていない 例え std::string args[argc];で有ってもアウト。std::stringとcharの配列には互換性が無い。
153 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:18:37.42 ] >>152 arg の初期化自体には別に問題ないだろ。 char* → std::string の変換がきく。
154 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:22:13.96 ] >>153 そういう問題じゃないだろ。 std::vector<std::string>をgetoptに突っ込めばいいと考えてる時点でダメなんだろ。
155 名前:133 mailto:sage [2012/05/13(日) 21:44:24.51 ] >>137 12クラスの多重継承を行った、とでも言うのでない限り、>137が>133(12バイトも増えた)の原因とは考えにくい 元クラスA,Bおよび派生クラスCそれぞれで仮想関数を使ってねえが そう考えると、2クラスの多重継承で12 バイト増える説明がつく。 それぞれのクラスが仮想関数テーブルへのポインタを含むから、4*3で12バイト増。 (これは>138のサンプルでf(), g()にvirtualを付けると検証できる。 また、強いて言えば>137のサンプル(仮想関数抜き)で どうして>133の多重継承理由(他のクラスでも使うから)になるのかわからん 別にMSを擁護するわけではないが、interfaceの多重継承みたいなことをしたいのだとすれば 基底クラスは必ずポインタ1個分(今日日のPCなら4バイト)の領域を占めるから、>140のような最適化の出番はない、 ハズ
156 名前:135 mailto:sage [2012/05/13(日) 21:47:48.55 ] 155 = 135。しつれい
157 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:49:56.32 ] PODという用語を理解してるなら 仮想関数使うとサイズが増えるのくらい知ってそうな気もするけど そうでない事もあるから困る
158 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:53:23.93 ] >>155 typedef やら static なメンバ関数やら、仮想関数以外にも継承したくなるものはあるだろ。
159 名前:155 mailto:sage [2012/05/13(日) 22:04:04.04 ] いやすまん、揉める前>155の「2クラス多重継承で12バイト増える」を訂正 >137のサンプルにおいて、 struct D : public A, public B { char a; virtual void f() { } }; としたとき、DとAは仮想関数テーブルへのポインタが共通 (単一継承と同様の関係で、DからAへのアップキャストは暗黙に行うこともできる) だから、仮想関数テーブルへのポインタによる増分は12でなくて8バイト。 残り4バイトは、charより大きいデータ(ポインタ)を含むから、整列の都合上3バイト埋められ、 それでトータル12バイトになる。
160 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 22:26:12.53 ] でっていう
161 名前:133 mailto:sage [2012/05/13(日) 23:16:40.69 ] >>155 133で出したクラスは、 9個のクラスを多重継承しており、 うち1つは、2つのクラスを多重継承しています。 完全にノーコストだと思ってたんでやられました。 継承はやめて全部コピペすりゃいいんでしょうけど・・
162 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:33:09.77 ] 組み込みでもやってんじゃないなら気にすんなよ んなもん今日大したコストじゃねぇぞ そんな事気にしてたらいつまで経ってもモノができん
163 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:51:21.35 ] どんだけ多重継承してんだ 継承なんて実際大して使わないと思うんだが 全クラスの2割くらいじゃね
164 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:54:03.40 ] 継承多用も頭悪いヤツが嵌るワナの一種だから仕方が無いのだよ
165 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 00:04:51.01 ] 継承なんてインターフェースの実装用としてしか使わんな 多重継承は使いまくる 実装継承使うときは、デフォルト実装が欲しいときぐらいだな 完全抽象化クラスを継承することがほとんど つか>>133 は何をどういう風に再利用する気なんだろう 再利用するとなると、<algorithm>がいろんなクラスに適用出きるように 普通クラス側でなくクラスを使う側なんだが
166 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 01:14:59.86 ] >>165 ベクトルです。float32 x 4で16byteな訳です。 多重継承している9種は、 ベクトルとの2項演算子 ベクトルとの単項演算子 ベクトルとの代入演算子 スカラとの2項演算子 スカラとの単項演算子 スカラとの代入演算子 などなど演算子が主です。 再利用化は、他に行列クラスにも使うためです。 合わせて6種類のクラスで使っています。 設計は満足のいくものだったんですが、 16Byteであるべきものが28Byteもあるようでは はっきり言って使い物になりません。
167 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 04:27:49.77 ] >>166 こんなのはどう? #include <iostream> template<typename Vec, typename Any> struct A : public Any { void a(){}; }; template<typename Vec, typename Any> struct B : public Any { void b(){}; }; template<typename Vec, typename Any> struct C : public Any { void c(){}; }; template<typename> struct Empty {}; struct MyVec : A<MyVec, B<MyVec, C<MyVec, Empty<MyVec> > > > { float x,y,z,w; }; int main() { std::cout << sizeof(MyVec) << std::endl; }
168 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 07:37:20.88 ] 継承じゃなくてマクロかincludeで対応するとか
169 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 20:03:33.91 ] public int FindIndex(Predicate<T> match) { } List<T>と同じ挙動のFindIndexを作りたいんですが、 どう実装されてるのかわかりません Predicate<T>からメソッドを取り出して、 フィールド変数T[] dataと一致を比較するにはどうしたらいいんでしょうか
170 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 20:10:22.47 ] 誤爆してた、すみません C#スレで聞いてきます
171 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 04:06:37.89 ] c丼もスコープ付きusingやtypedef使えれば 便利なんだがなぁ
172 名前:デフォルトの名無しさん [2012/05/17(木) 19:49:25.05 ] 相談室ってこんなに過疎ってたっけ? ・・・というのはさておき、 struct A { const std::string get(const std::string& value) const { return value; } const bool get(bool value) const { return value; } }; これで error: conversion from 'bool' to non-scalar type 'std::string {aka std::basic_string<char>}' requested って怒られるのなんで? string関係はいつもストレスやわ・・・
173 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 20:51:19.48 ] >>172 ideone.com/hoiKy 再現するコードかかないとわからんよ 引数の型間違ってるだけじゃないの?
174 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 21:11:17.03 ] どうせa.get("abc")にしてんだろ んでconst char*からの変換ではconst std::string&よりboolのほうが優先されて 返り値がboolなのにstd::stringで受けようとしてるからエラー
175 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 01:35:02.13 ] うわっ、申し訳ない。その通り。 a.get("abc")てしたせいです。 この問題って、もしかして std::ofstream::ofstream(std::string) が存在しなくて、char*にしてある理由と同じ? なんでいちいちc_strにしないといけないのかいつも不思議だったんだけど。 ・・・しかもC++0xで修正されているというのも更に分からん。
176 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:33:19.95 ] それとは関係ないだろ
177 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 11:32:06.88 ] >>166 ベクトル・行列演算クラスを自前で作っても、設計や速度の点で不満が出るかもしれない。 テンプレート使った高速化の設計ならBoostを見てみるといいかもしれない。 参考→ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html もしくは、浮動小数点やスカラーではなくベクトルや行列の演算は CPUではなくGPUで処理したほうが圧倒的に早いいいので、 Windows環境限定でそこそこのグラフィックカード使えるなら DirectX.MathやCUDAを使ったら早くなると思う。(LinuxでGPU使う方法は調べたこと無い) こいつらより早い行列計算ルーチンを書くのは至難だよ。 CPUの性質やコンパイラの最適化とか熟知してる連中が作ったライブラリだから。
178 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 19:36:09.33 ] >>155 関係ないけど、未だに32bit環境がデフォと思っているやつは何なんだろうか?
179 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 19:43:35.13 ] >>177 CUDAが必要なレベルだとかなり大規模になる必要があるし、CUDAの持って行くのには別の苦労もあるから、MKLとかの方がいいぞ。 Sandy-Eがでてからは余程いいVGAはないと大きな差が出ないか、逆に遅くなるからな。
180 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 20:19:12.21 ] >>177 BoostはFortranのuBlasを再現したものだから Blits++の方がいい。速度もこっちの方が速いしね。
181 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 20:51:21.10 ] Blitz++か あの変態演算子オーバーロードか カンマ演算子をオーバーロードしたライブラリは初めて見たよ
182 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:13:24.42 ] よく知らないけどEigenがいいと聞いた
183 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:31:33.61 ] >>181 >カンマ演算子をオーバーロード そんなこともできるのか点点点
184 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:40:31.23 ] >>183 行列の要素を読み込むのに使ってる ドキュメント読んでみ
185 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:49:13.44 ] A = 0.5, 0.3, 0.8, 0.2, 0.1, 0.3, 0.2, 0.9, 0.0, 1.0, 0.7, 0.4, 0.2, 0.3, 0.8, 0.4; こんな書き方をするにはカンマ演算子のオーバーロードしかないだろ
186 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 22:41:45.37 ] 自動的に4×4?
187 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 22:56:32.85 ] いや Array<FixedPoint, 2> A(4,4); って宣言してる
188 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 23:00:15.42 ] 書き方はすっきりするけど 速度的にどうなんだろうか
189 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 23:07:43.73 ] 初期化のつもりだろうからそんなに速度必要ないんじゃね 問題は肝心のテンソルの演算速度
190 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 17:53:27.61 ] C++ 2010で画面上部のプルダウンメニューからDebugをReleaseへ変更しようとしているのですが、プルダウンメニューが反転していて選択できません。 どうすればよろしいでしょうか?
191 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 18:00:27.85 ] >>189 Blitz++だと式テンプレート使いまくっててFORTRANと同程度の速度がでるらしい。 ただ、速度求めるなら最初からGPGPU使った方がいい気がするが。
192 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 18:51:40.18 ] CUDAみたいな類のは4桁×4桁をガンガン回すぐらいじゃないと牛刀 16×16ぐらいなら転送のコストで帳消しになるだろう
193 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 19:05:49.99 ] OpenCVとか必要ないレベルなら速度にこだわる必要もなくね?
194 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 19:49:45.50 ] >>191 FORTRANて別に速いわけじゃないのに、なんで使われているんだろ? やっぱ過去の資産かな? 配列の並びが逆なのが気持ち悪い。
195 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:03:52.87 ] >>94 つ[ポインタのエイリアス問題] C/C++はこれがあるために配列で最適化が十分に出来ない VCなら__restrictとかC99でrestrictという予約語を使うとFORTRANと同等に出来る
196 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:04:11.77 ] ありゃ ×>>94 ○>>194
197 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:15:57.73 ] しかしこの過去スレひどいな logsoku.com/thread/pc11.2ch.net/tech/1177215582/ ちゃんとここに書いてあるのに seclan.dll.jp/c99d/c99d07.htm 7.6 restrict ポインタ
198 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:37:06.35 ] >>194 実際速いから。あとC++じゃベクトル命令(SSEの類ではない) まともに自動で使えないから。
199 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:45:37.65 ] pascal の配列演算がなぜFORTRAN と並ぶに達せなかったのかに疑問が沸く
200 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:57:54.26 ] >>195 C++には無いよ。C++11なら無視されるらしい。
201 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 21:34:30.81 ] 金が足りなかったんだろう