- 1 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 16:10:55 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.68【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1253193779/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
- 445 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 13:58:05 ]
- >>444
補足ありがとうございます。 //普通の変数。スタック領域に実態がある。 int main(){ int a; Cls b; } //普通の変数。データ領域へのポインタ。 class Cls{ public: int a; TestCls b; } //これはスタック違いかな?メモリ領域のスタックの事ではなく、スタックという機能? #include <stack> template<Class T, class Container = deque<T> > class stack{};
- 446 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 14:01:46 ]
- >>445
*が付いてなければおよそポインタではない まだ何か勘違いしてない?
- 447 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 14:21:55 ]
- >>445
スタックってデータ構造もあるけど、それに近い機能をもったメモリ領域がある。 関数とかの中で、 { /*DoSomething...*/ } のように記述するとブロックとして認識されてそのブロックの中で宣言された自動変数はブロックを抜けると破棄される。 これをスコープという。ブロックは入れ子にしたりして何個でも作れる。 ポインタなどはポインタ変数は破棄されるが、指してる先をdeleteするような器用さはない。 ちなみに、以下は class Cls{ public: int a; TestCls b; }; どっちの宣言も自動変数。 sizeofで見てみるとわかると思うけど、sizeof(int)+sizeof(TestCls)の領域が確保されることになる。 C++の参照型は、 Cls& <- 一度しか初期化できない参照。 Cls* <- 何度でも初期化できる参照。名前はポインタと呼ばれる。 javaだとクラスを宣言すると無条件でC++でいうCls&の形をしたポインタが使われるみたいだ。ちなみに俺はJAVAは初心者以下だ。
- 448 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 14:37:27 ]
- 仮想関数テーブルとか考えると危険な…いや、なんでもない
よく分かってないことは書かないことにしましょうか
- 449 名前:447 mailto:sage [2009/10/30(金) 14:47:30 ]
- >>448
vtableは使ってないから説明してない。 仮想関数のオーバーライドの説明だけど、 C++の上書きオーバーライド(virtual function)は、大雑把に言って関数ポインタを上書きすることで実現している。 そのためにはクラスのメモリのどこかに関数ポインタのリストを持つためのポインタを持つことになる。 基本的にこれはメモリを操作してかきかえる類ではないのであることを知っていればいい。 で、仮想関数を持ったクラスをsizeofをすると関数ポインタのリストのポインタ変数のサイズ分増分して返ってくる。
- 450 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:06:07 ]
- >>446
×//普通の変数。データ領域へのポインタ。 ○//普通の変数。スタック領域に実態がある。 なんかもう滅茶苦茶ですね。 書き間違いと勘違いといろいろまざtt・・・ >>447 #include なんちゃら int gInt; //データ領域に実態が格納されているグローバル変数(非自動変数) TestCls gCls; //同上 class Cls{ public: int a; //スタック領域に格納されている自動変数 TestCls b; //同上 }; int main(){ int a; TestCls t; //スタック領域に格納されている自動変数 } 今度こそOKでしょうか? >>448 >>449 初めて目にした単語なので、wiki見てみましたがイミフ。 基底クラスAを継承したサブクラスB,Cがあり Aで仮想関数speakを宣言し、B,Cクラスでそれぞれ実装した場合、次の関数の呼び出しはどうなるか? ClsB b; ClsA *a = &b; a->speak(); どう考えてもBで実装したspeakが呼ばれます。vtableの入る余地がありません。 ちょっと試行錯誤してきます。
- 451 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:29:09 ]
- 1.ClsA *aはポインタ型なんだから、ClsAの継承クラスのインスタンスならどれでも受け入れられる。
2.受け入れるオブジェクトの型は、ユーザーの入力などにより動的(実行時)に変化する。 以上より仮想関数テーブルが必要になる。 450のように、静的(コンパイル時)に型が限定できる場合ばかりではないということ。
- 452 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:29:31 ]
- >>450
基本的にグローバル変数も自動変数というルールに違いはない。 それは、グローバルスコープに宣言されているという前提になる。 あと、ちょっと妙な書き方をしてしまったので訂正するが、 class Cls{ public: int a; //スタック領域に格納されている自動変数 TestCls b; //同上 }; 上のクラスをnewしたら、自動変数とされる領域もヒープに確保される。でも動作は自動変数と変わらない。 deleteした瞬間がスコープ終了の瞬間。 あと、オーバーライドの話。 C++のオーバーライドはvirtualをつけなかったら、上書きされない。よって、vtableも生成されない。 つまり、基本的には、そのクラスで宣言されたそのメンバ関数が呼ばれる。 virtualをつけてオーバーライドされる前提のメンバ関数は継承先で上書きすることができる。 virtualの上書きされた関数は、基底でも上書きされた関数を呼ぶ。 もちろんインスタンスは実装したクラスのインスタンスじゃないといけないけども。
- 453 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:43:11 ]
- ちょっとした違和感を感じたんだが、
>>450 の言うデータ領域って、たとえばimmutableな文字列定数とかを格納するところかな?? static constの変数とか。
- 454 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:59:33 ]
- 何かもう、ネイティブコードでどう実装されてるかから説明した方が早い気がしてきた
- 455 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 16:25:02 ]
- >>451
ttp://codepad.org/Pldw34mI 1と入力するとsub1が表示され、1以外を入力するとsub2が表示されます。 何も問題ありません。頭が爆破寸前です。 >>452 >上のクラスをnewしたら、自動変数とされる領域もヒープに確保される。 おkです。 >でも動作は自動変数と変わらない。 >deleteした瞬間がスコープ終了の瞬間。 自動変数の定義は、「関数内で宣言された記憶クラス指定子の付かない変数」ですよね? deleteさえしっかりやれば、newしたものも自動変数と同じ振る舞いをすると。 >>453 >>450のソースのコメントは間違い・・・? 下記2種「以外」の変数が格納される領域がデータ領域? ・グローバル変数 ・自動変数
- 456 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 17:10:43 ]
- >>455
C++におけるメジャーなメモリ領域は2つ。 一つはスタックと呼ばれる領域。一つは、ヒープと呼ばれる領域。 スタックは宣言したときに確保されてスコープが終了したら破棄されることを約束された領域。 ヒープはメモリのプールで必要なときに確保して不要になったらユーザの責任で開放する。資源は有効に。 で、コード領域やデータ領域というのはコンパイラやOSの最適化によって発生した領域。 たぶん、データ領域は何度も参照されるような定数データを効率よく回すための機構で基本的に書き込み禁止。 で、たぶん、コード領域はプログラムコード自身をOSがロードした領域。 なので、後の2つはC++の仕様外だと思う。
- 457 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 18:40:54 ]
- >>456
静的記憶期間(static付きやグローバル変数など)のオブジェクトの置き場なのだから、 データ領域はスタック・ヒープと同列に扱おうよ。 規格書でも(言葉は違うけど)その3つの概念は出てくることだし。
- 458 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 19:24:41 ]
- コンパイル時には、ClsSub1になるのかClsSub2になるのかわかっていない。
→このままでは、ClsSuper::test(), ClsSub1::test(), ClsSub2::test()のどれとしてコンパイルすればいいのかわからない。 このコードで言うと、sub1, sub2 superのどれを表示していいかわからない。 ここまでは大丈夫? 次に、ClsSuperの隠しメンバ変数にpTestFunctionという関数ポインタを追加して、 実行時、インスタンスが生成時にその関数ポインタへ使用すべきメンバ関数を代入するようにする。 ClsSuper *s; には使用すべき関数ポインタが含まれているので、 コンパイル時に s->test(); という文を、関数ポインタからの呼び出しに翻訳する。 実行時に、sがどの型をさしていようと適切な関数ポインタが指定されるので、問題なく実行できる。 > 1と入力するとsub1が表示され、1以外を入力するとsub2が表示されます。 というのは、仮想関数テーブル(=関数ポインタのようなもの)が仕事をしてるから。 とりあえずコメントにも補足書いたけど、以上が仮想関数テーブルが必要な理由。 codepad.org/uuPlC3eO
- 459 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 20:26:13 ]
- >>456
>>457も言ってるけど、スタックとヒープと静的の三つとした方が。 静的記憶は普通に読み書き可能なことが多いんじゃないかな、x86では。dsセレクタで アクセスされるようなセグメントに配置するのが一般的な気がする。 リードオンリーの定数はむしろ、コンパイル時点で埋め込んじゃう気がするし。
- 460 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 20:47:25 ]
- スタックもヒープも物理的には同じだぞ。
コンパイル時に固定サイズの領域を割り当てるのがスタック。 スタック不足になるのは、メモリが足らないからではなく 予測以上に初期の固定メモリを使い切ったため。 物理的には、スタックもヒープも違いはないので、 多くメモリ確保するなら動的=ヒープがいい。
- 461 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 21:00:19 ]
- >>456>>457>>459>>460
今の私の認識と、説明していただいたメモリ領域の説明がだいたい一致するので メモリ領域に関しては大丈夫そうです。 >>460 >多くメモリ確保するなら動的=ヒープがいい。 私がはじめに学んだ言語ではそのあたりを気にしながらコーディングしていましたが c++においてはまったく意識してませんでした。 メモリをいっぱい使うような処理をする場合には気をつけてみます。 >>458 40行目で正しく関数が呼べてるのは仮想関数テーブルがあるからなんですね。 コーディングしている分には見えないものですが、内部的には説明してくださったような動作になっていると。 今日1日でc++に対する理解度がだいぶ深まった気がします。
- 462 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 21:05:38 ]
- aa
- 463 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 21:08:23 ]
- でもヒープ確保には、OSとのやりとりがあって、生成に時間食うがな。
スタックは、はじめに確保した領域を使い回すだけだからOSとのやりとりはなく 高速。
- 464 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 21:11:40 ]
- 動作速度に関しては、
スタック ヒープに違いはないが 生成と破棄に関しては違いが出るってこと。 長いこと(10秒以上とか)保持するなら、 生成コストは無視できるから 安定性のためヒープを使う方が良いな。
- 465 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 22:07:18 ]
- 待て待て、スタックとヒープは実装原理が全く違うがな。適当言うんじゃない。
一般的なスタックは、pushするかスタックポインタを移動させることで積み上げて、 破棄する時はスタックポインタの移動だけで終わるから、ヒープに比べたら圧倒的に 確保も解放も高速だぞ。
- 466 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 22:08:28 ]
- 確保と解放は速度差があるが、確保されたメモリを使う分には同じ速度だな。
- 467 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 22:26:53 ]
- >>465
確保方法に違いはあっても、どちらも同一の(実)メモリつかうんだよ。 OSに問い合わせるか、C言語が管理している領域に問い合わせるかだけ。 スタックでさえ仮想メモリに移動することもある。 OSや他のアプリからみれば特殊な物ではない。
- 468 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 23:41:54 ]
- とりあえず確保解放の速度が圧倒的に違うのは確実だけどな、スタックとヒープじゃ。
>>466がほとんどの環境で正解。
- 469 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 23:44:38 ]
- 圧倒的に違うといっても総実行時間の何%だよ
以下ループ
- 470 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 01:50:36 ]
- ボトルネックに突っ込んだら恐ろしく違うだろうな
- 471 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 03:11:39 ]
- まぁ環境によっていろいろあるってことでFA
- 472 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 03:48:03 ]
- dllを作っているのですが
デバッグでは作成できて、リリースしてビルドすると ライブラリ ***testdll.exp を作成中 LINK : fatal error LNK1561: エントリー ポイントを定義しなければなりません。 ビルドログは "***" に保存されました。 testdll - エラー 1、警告 0 と表示されてできません どうすればできるのでしょうか・・・・・
- 473 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 03:52:30 ]
- >>472
「エントリーポイントを定義しなければなりません」 ↓ エントリーポイントを定義すればできる これぐらいの推測ができないようじゃ、前途多難だな。
- 474 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 11:53:20 ]
- enumとかstatic constの定数は外のクラスに見せないならクラススコープでprivateで定義するのが良いんですよね?
- 475 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 12:31:50 ]
- コンテナのイテレータから、渡されたコンテナの要素数を求めることはできますか?
template<class Iterator> size_t Size(Iterator it) { return ?; } int main() { std::vector<int> lhs; lhs.push_back(1); lhs.push_back(2); std::vector<int>::iterator ite; ite = lhs.begin(); int n = Size(ite); // こんな感じでコンテナの要素数を求めたいのですが }
- 476 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 12:34:41 ]
- vector::size()では何か不都合でもあるの?
- 477 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 12:42:59 ]
- >>475 です
vector::size() をこのように使っているのですが これでは、イテレータを渡しても、当然のことですがエラーになってしまいます、 なんとかイテレータを渡して、そのコンテナのサイズがわからないものかと思案しています。 template <class Container> inline size_t Size(const Container& c) { return c.size(); }
- 478 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 12:55:04 ]
- 要素へのポインタを所有しているコンテナを特定する手段があるなら可能
- 479 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 13:02:22 ]
- >>470
ボトルネックの個所で スタックだろうがヒープだろうがメモリの確保解放するコード書くのは論外だろう
- 480 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 13:09:48 ]
- >>479
秒間一万回程度の半端なボトルネックだと、スタックかヒープかで致命的な事態に なるだろうな。 まぁ、違いを知った上で、大差無いと判断したところで使うのは最初から問題無い。 「違わない」と断言するのは激しく問題があるってだけ。カーネルに落ちる場合は スタックの数万倍も重いことがある訳で。
- 481 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 13:10:09 ]
- >>478 thx です
関数オブジェクトを作っていて、引数が多くなってしまい なんとか、減らせないものだろうかと思い質問したしだいでした 要素へのポインタを所持しているコンテナを引き渡すのなら、 要素数を引き渡すだけのことなので、同じくらいのコストがかかりそうで あききらめますが、要素へのポインタを所持しているコンテナを引き渡して 要素数を求める方法へ関心があります、単純な実装例をご教示願えませんか。
- 482 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 13:29:21 ]
- c.size()
- 483 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 13:45:50 ]
- >>477
イテレータのペア(開始と終端)を取る関数オブジェクトなら std::distance(it1, it2) で [it1-it2)間の要素数が求められるよ。
- 484 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 14:20:44 ]
- >>475,477,481
ひとつのイテレータからコンテナの要素数を求める一般的な方法はないよ。 実装依存の機能でそういうのがあるか、自分で実装すれば可能。 beginとendがあるなら>>483のでいける。
- 485 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 18:59:20 ]
- >>484ありがとう
>実装依存の機能でそういうのがあるか、自分で実装すれば可能。 もし仮に実装するなら、どんな感じになるのでしょうか? まずは、イテレータのアドレスを取得しなければならないのはわかるのですが それ以降の展開が想像できません、向学のために概略だけでも教えてもらえないでしょうか。
- 486 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 19:11:13 ]
- >>485
MinGW だとイテレータはコンテナのアドレスを持ってるようだ
- 487 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 20:54:21 ]
- そもそもイテレータ渡ししてるのに本当に要素数が必要なのかから考えるべきな気がする。
- 488 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 21:51:29 ]
- >>485
元のイテレータの派生クラスかラッパークラスを作って、そいつに要素数か親コンテナのポインタを持たせる。 しかし、親コンテナの要素数が必要な処理ってどんなだ? コードをさらしてみる気はないか?
- 489 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 21:56:41 ]
- 技巧する必要なし
元のをを渡せよ。
- 490 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 22:09:55 ]
- 引き数へらしたいならレンジイテレータでもつかってコンテナまるごと渡せよ
- 491 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 21:07:20 ]
- 演算子のオーバーライドって一般企業でも使ってますか?
パッと見どうゆう動作をするのかわからないから、危険な香りがするのですが。 例えば、タスクシステムを使っていて、とあるクラスをnewするとそのクラスをタスクに追加したりするような仕組みの場合 一見メモリリークするコードに見えます。
- 492 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 21:13:44 ]
- >>491
基本的にそういうことはドキュメントに書いておくべきことじゃないかなぁ。 読まない人もいるみたいだけどね。読みやすいドキュメントって言うのもむずかしいけど。
- 493 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 21:13:49 ]
- >>491
何を使っても酷いことになる人はどこにでもいるよ
- 494 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 21:28:12 ]
- >>491
そんな事言ったらoperator+をオーバーロードしてマイナスの動作を させるへそ曲がりな事だって出来るぞ 仕様書でちゃんと最初に決めとけ
- 495 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 21:46:43 ]
- >>491
危険だよ。だから是非使うべきだと感じないなら使うものではない。ただ、例えば、 class に + or - があればすごく楽な場合があるでしょ。operator overloading して a+b+c と書くのと a.plus(b).plus(c) とか書いたり してわかりにくくなる(そしてミスしやすくなる)のとのどちらが良いか。 どう使うかによる。グループで仕事してるなら合意が必要。たとえば、一応 ttp://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Operator_Overloading#Operator_Overloading
- 496 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 22:15:04 ]
- >>491
基本的には使わないだろう。企業に限らず。 でも、例えば多倍長整数クラスとか、有理数クラスとか、ベクトルクラスとかを 作るなら、operator+を定義しても恐らく誰も間違わない。そういう場合は使う 方が楽という判断も十分有力だし、それでも使わないという判断もやはり有力。
- 497 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 22:17:08 ]
- まぁ、暗黙の変換なんかと同じだな。
無闇やたらと使うのは糞設計だが、完全排除すれば良設計というものでもない。
- 498 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 22:28:05 ]
- 微妙なら()つけろよ。簡単のために公開しない関数内部で使うなら別に良いだろ。
- 499 名前:デフォルトの名無しさん mailto:sage [2009/11/02(月) 23:31:40 ]
- >>497
俺は argument 一つの constructor はやっぱり explicit 付けてる。 operator overloading の方はたまに使う時がある。
- 500 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 03:04:26 ]
- スマポなんかは暗黙の変換に対応しないと微妙
- 501 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 06:28:54 ]
- >>491
× オーバーライド ○ オーバーロード あと、タスクシステム死ね。 > とあるクラスをnewするとそのクラスをタスクに追加したりするような仕組みの場合 > 一見メモリリークするコードに見えます。 具体的なデメリットがわかってるのに、なんでそのうえで一般論を持ち出す必要があるの?
- 502 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 14:46:36 ]
- すいません。下記のようなことがやりたいのですが、
”\debug.cpp(13) : error C2059: 構文エラー : ')'” と表示されコンパイルが通りません。どうしたらいいですか。 void Debug::create_debug_message(...) { char tmp_str[100]; sprintf(tmp_str, __VA_ARGS__); // line: 13 }
- 503 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 14:50:37 ]
- >>502
void Debug::create_debug_message(const char *format, ...) { char tmp_str[100]; va_list ap; va_start(ap, format); vsprintf(tmp_str, format, ap); }
- 504 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 14:58:30 ]
- できました。ありがとうございました。
- 505 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 15:54:29 ]
- そういや可変長引数長い事使ってないなあ
リハビリしとかなきゃ
- 506 名前:491 mailto:sage [2009/11/03(火) 18:00:50 ]
- >>492-497
多倍長整数クラスの+のように、直感的にわかるような動作をするものなら演算子のオーバーロードをしても良いが 基本的に多用するものではないということですね。 >>501 >×オーバーライド 間違いを確認しました。 >具体的なデメリットがわかってるのに、なんでそのうえで一般論を持ち出す必要があるの? デメリットがあっても、それを打ち消すようなコーディングの仕方や デメリットを凌駕するメリットがあれば、演算子のオーバーロードを積極的に使っていこうと考えていたからです。 私はC++を勉強しはじめてまだ日が浅いので、私の知らない何かがあるのかもしれないと思い、質問させてもらいました。 一般的な演算子のオーバーロードに対する考えが聞けて、とてもためになりました。 ありがとうございます。
- 507 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 12:21:15 ]
- >>506
業種によっても違うんじゃないかな。 私のところは画像処理や数値計算関係なので座標の足し算とかベクタの掛け算なんかが 頻発するので演算子オーバーロードはあるとないとじゃ大違いだから。
- 508 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 16:41:27 ]
- ベクトルの掛け算も演算子オーバーロードしちゃうのか…
内積にすんのかな
- 509 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 16:48:04 ]
- スカラ倍のことじゃないの
- 510 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 17:07:21 ]
- 内積、スカラ倍両方オーバーロードするのもありだな。
いずれにせよ、ベクトルや行列使った数値計算とかは オーバーロードしないとコードが読めなくなるからリスクとの トレードオフとして悪くないと思う。
- 511 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 17:18:02 ]
- インラインアセンブラと組み合わせれば演算子でSIMDも可能
って考えるとなんか夢が広がるような気がするよね 実際には関数呼び出しだって同じなんだが、表記的に 高水準(抽象的)・低水準(具体的)の混在具合が脳汁出そう
- 512 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 17:59:50 ]
- ベクタ×ベクタは演算ライブラリによっては内積だけど、
演算ライブラリによっては敢えて用意していないね。 それでもスカラ積があるだけでも随分違うけど。
- 513 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 21:19:06 ]
- 「絶対に内積だろ」とは言い切れないし、スカラ積だけ対応するのが個人的には好み
だけど、内積でも別に文句言うほどじゃないかな
- 514 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 21:55:01 ]
- スカラ積って内積じゃないの
- 515 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 21:59:47 ]
- iostreamやBoostに見られるような「Cの文脈からかけ離れた演算子オーバーロード」
は、実際使ってみると割と平気だったりするんだよな。 ただ、見慣れない問題に直面する可能性も高いから、やっぱりお仕事だと微妙かな。 boost::formatとか激しく便利ではあるんだけど。
- 516 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 22:57:49 ]
- >>514
数Bやり直せw
- 517 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 23:06:14 ]
- >>516
おまえこそやり直せ
- 518 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 23:14:19 ]
- 小学生ktkr
- 519 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 03:19:55 ]
- スカラー積=内積
ベクトル積=外積
- 520 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 08:51:58 ]
- >>503
va_endわすれてるぞ
- 521 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 09:18:30 ]
- スカラー積ってスカラ倍のことじゃないの?
- 522 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 09:24:31 ]
- もうその話題は終わり
- 523 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 09:48:19 ]
- namespace Hello
{ class A; }; namespace World { class B; }; ヘッダーファイルに上記のように書いたところ、 class Bの所属がなぜかHello::World::Bとして扱われてしまい、 コンパイルエラーになります。これはコンパイラのバグでしょうか? 環境はwinXP x86 VC++ 2008Expressを使ってます。
- 524 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 10:01:37 ]
- どうせ打ち間違い
523自体は正しい
- 525 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 10:03:15 ]
- ていうかエラーメッセージ書けって
- 526 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:07:06 ]
- もう少し状況を詳しく書いてみます
"helloworld.h" namespace Hello { --class A; } namespace World { --class Hoge; --namespace Button --{ ----enum Value { A, B, C }; --} }; "hoge.h" #include "helloworld.h" namespace World { --class Hoge --{ --public: ----Button::Value m_value; --} }; "error messeage" C3083: 'World': '::' の左側のシンボルには、型を指定しなければなりません C2460: 'Hello::World::Value::m_value' : 宣言されている 'Hello::World::Value' を使用しています。
- 527 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:10:32 ]
- >>526
namespace Helloが閉じていない。 # まぁ、想定の範囲内だな。
- 528 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:11:50 ]
- Hello::
まで書くとvisual studio のインテリセンスがWorldや ヘッダーに書いた他のnamespaceを全部含んでしまっているように表示します。 World::やその他のネームスペースからはHelloを参照することはありません。
- 529 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:14:22 ]
- ;が抜けているのに気づけない間抜けであったか。
- 530 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:14:30 ]
- 本当だ。すいません小さなミスでした。
- 531 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:32:52 ]
- VCなんですけど
floatとdoubleはどっちが速いですか?
- 532 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:39:13 ]
- >>531
一概には言えませんが、doubleで組んで速度に不満があったら両方実測して比較すればよいでしょう。
- 533 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:43:23 ]
- floatが速いよ
昔は、doubleに変換されるという説もあったが、いまは直に計算する。
- 534 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:45:13 ]
- 特に配列に格納すると、メモリ呼び出しが半分のサイズですむから
計算だけではなく、メモリサイズと呼び出し時間が短縮できる。
- 535 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 11:52:00 ]
- フロートがSSEで二倍速い
- 536 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 12:10:08 ]
- namespaceって;必要だっけ?
- 537 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 13:15:38 ]
- 必要じゃないことはないですよ
- 538 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 16:20:32 ]
- floatにしてみます。
- 539 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 16:43:18 ]
- floatは有効桁数がIEEE754では6桁しかないよ
だから用途が限られる 画面座標とか
- 540 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 17:46:27 ]
- 配列のインデックスは符号無しですか?
- 541 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 18:05:17 ]
- 厳密に言えば、いいえ
- 542 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 18:58:15 ]
- ポインタの計算だからマイナスもある
- 543 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 19:14:31 ]
- まず配列のインデックスの定義をだな
- 544 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 20:29:16 ]
- namespace は ; いらないよね??
class は ; いるけどさ。 ていうか namespace {} に ; つけないで普通に使っているんだが…
- 545 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 20:35:52 ]
- クラス定義は文だから;が必要で名前空間はスコープだからいらない。たぶん
|

|