C++相談室 part140
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured 使いもしないオプションを付けて時間がかかるとか言ってる人がいるってマジ? >>756
htmlやcssはできるので調べてみます もしかしてc++って個人で使うようなものではなかったりしますか? >>773
目的によるだろうね
個人でC++を使ってる人の大半はC++を使うこと自体が半ば目的化していると思う
自尊心と中二心をくすぐる言語だから 間違いなく C++ に出来ることは多いのだが、
要はそこまで必要な場合ってそんなに多くないでしょって話。
画像処理とか仮想通貨マイニングみたいな性能のチューニングがギリギリまで必要ってのなら
C++ を使う甲斐があるけど、 GUI を記述するのに C++ を使うのはそれほど強い必然性はない。
本来の処理をする部分が C++ で書かれているなら、
あえて GUI だけ別言語にする必要もないなっていう程度のことだと思う。 意外とここアマチュア多かったのかな?
仕事でもないのにわざわざC++触るやつの気が知れん 型がきっちりしてるから処理追いやすくていいと思うんだけどなあ
Javascriptで書かれたオープンソースなんて読んでもわけわからん ワイはアマチュアやで。 むしろプロは必要もないところまで取り組まんやろ。
知り合いにプロのゲームプログラマ (誰もが知っている有名シミュレーションゲームの老舗メーカーに所属)
がいるけど、 C++ の言語機能に関する知識なんて、びっくりするほど貧弱やぞ。 ゲームプログラマは特殊だわ
あいつら例外なくゲームのことしか頭にないし
エンジン作ってる部署の人なら詳しい人もたくさん居るだろう 可読性とデバッグのバランス考えると、
C中心で毛が生えた程度に++浅く
使うのが一番楽。
物理計算とかAIとかのが重要で
C++の文法遊びや多重にネストした
テンプレ遊びに深く付き合っても、
生産性上がんないからなあ。 テンプレみたいなコンパイラ毎に動作の異なるもんに執着してたら明らかに生産性下がるわ。 ++で生産性上がらんとか言ってる人はOOP理解出来てないだけだろ
俺も昔は同じで++に謂れのない敵意を持ってた
でも他のモダンな言語に乗り換えてファウラーやエヴァンスなどを読み漁ってOOPに習熟してから++に戻ってきたら今度は逆にCがゴミに思えるようになったよ
まあしかしこの壁を乗り越えるまでが大変なんだけどね C++はクラスの記述コストが高すぎて真面目にOOPするには辛いわ
モダンな言語と比較して、心理的にどうしてもクラスやメソッドの粒度が大きくなりがち C++クラスの最大の恩恵はRAII
ガベコレなし、値指向、デストラクタ最強 C++は破壊的代入ができるから嫌
デフォルトがconstでないとか、言語としてどうなの… >>774
なるほど、自分はcgやりたいのでC++使うしかない感じですが、とりあえずc#をまともにできるようになります >>782
jsみたいにブラウザ毎に動作の異なるもんに執着してたら明らかに生産性下がるわ。 ブラウザごとに動作が異なるのは、マイクロソフトが憎いからであって、影響力を失った今、マイクロソフトと違う動作にする必要が無いような気がする。 まだデスクトップでは絶大なる影響力があるから駄目だ。
凋落のメドも立ってない。 そしてGUIライブラリ開発者が萎えてQt一強になったりwebview的なものが流行るんですね
もうおしまいだわ 未来ではリテラシーが高まってCUIが標準になってるよ
GUIはエンタメ分野でだけ生き残る Windowsタブレットは中々イケてるけどな。
ちょっとだけ未来が見えるんだけど、惜しい、まだ未来じゃない。
って感じ。
手書きは流行ると思うよ。
電車の中でキーボード打つのは無理だけど、手書きなら何とかなる。
でも、ペン高いし、文字認識は驚くほどの精度だけど、図は描きにくかったり。
まだ未来は来てないんだよね。 参照渡しについて質問です
void hoge(const int &x) ってすると int以外の型を渡すと危険ですか?
(short、long、unsigned、doubleなど)
void hoge(int x) のほうが安全な気がするけど、別にどっちでも一緒ですか? int以外の型を渡せばintに変換した一時変数が作られてその参照が渡されるからそこに危険性はない >>800
そもそも参照である必要を感じない
実質ポインタだから無駄な参照く constの参照渡しってでかいコピーを作りたくないときだよね? >>801-804
なるほど、安全性は一緒なんですね。
うちの会社にそういうコードを書くベテラン社員がいるので、
気になって質問させてもらいました。
やっぱり組み込み型は普通に値渡しでいいみたいですね。 c++だけで個人でソフトを完成させるのはめんどくさすぎるのですかね >>800
そもそもc++でプリミティブ型単体で引数にすることなんてあるの?
できるだけクラスか構造体にラップして参照渡しするもんだけど それjavaでやってる奴見たことあるけど無駄すぎて周囲に陰で笑われてたぞ >>808。
Cの時代から普通にあるよ。構造体で渡すまでもない場合はそれが最も効率がいい。
int add( int x, int y )
{
return x+ y;
}
float fadd( float x, float y )
{
return x+ y;
}
とか。 ↑とか言って人を見下す奴もゴミのようなtypedefの山には疑問を抱かないのがC++er logとって足し算or引き算に降格なんて良くする事でしょ >>800
C++ で参照渡しする理由は:
1.構造体などをそのまま引数に渡すと、スタックにコピーする動作が入ってしまい、
構造体のサイズが大きいと時間がかかる。参照渡すにすると先頭アドレス
(4バイト、または、8バイト)だけがスタックにコピーされるので効率がいい。
int, float などは、中身のサイズとアドレスのサイズが変わらないので参照渡し
にしてもコピー動作に置いては効率が上がらない。そして、実際に引数を
読み取る段階では、参照渡しは1クロックほど時間が余計にかかってしまう。
2. 戻り値には1つの値/オブジェクト/変数しか返すことが出来ない。そのため、2つ以上の
値を返したい場合には、C では伝統的には、引数にポインタ渡しで変数の先頭アドレス
を渡し、そのアドレスを介して対応する変数に値を書き込む方法をとっていた。
C++ では、ポインタ * の変わりに参照 & を使うことが出来るようになった。
参照の方が見易かったり、分かりやすかったりする事があるといわれている。
3. const int &a や const float &a では、値を呼び出し側に返すことが出来ない。なぜなら、
const 属性が付いているから呼び出された関数側からは書き込めないため。
その上、アドレスのBIT数が、中身のBIT数と同じか、むしろ大きいので、実引数から
スタックにある仮引数へのコピー動作に置いても効率も上がらない。
さらに、参照なので、実際に読み取るときには1クロック余計な時間がかかってしまう。
だから、int a や float a で渡すほうが良い。 >>814
手短に説明するのは難しいが、float と double は、それぞれ32BIT、64BITで、
ポインタのBIT数と同じかどうかは、使ってるOSのBIT数によって違ってくる。
だから、double 型を参照渡しで渡した場合、わずかに効率が上がる場合が
絶対ないとは言い切れないかもしれない。ただし、その場合でも、参照型
の仮引数を実際に読み取るときには、「間接参照」というアセンブラで書くと、
[アドレス値] や、[ポインタ値] のようなオペランドを持った mov 命令が
1つ追加で必要になって、1クロック分余計にかかる。
なお、処理系によっては、関数呼び出しに置いては、float 型でも、double 型として
渡される場合があるかもしれない。
だから、関数呼び出しの時点でわずかに効率が上がっても、読み取る段階で
1クロック遅くなるかも知れない。だから、この位のBIT数の変数の場合で、
値を呼び出し側に戻り値として「出力(返す)」すつもりではい場合には、
参照渡しにせず、値渡しにしたほうが良いと考えられる。 void hoge(const int *x)と同じことだろ そんなところの速度気にする前に無駄なI/Oや描画処理がないかとかクソみたいなアルゴリズム使ってないかとかを心配しろ C++もC#みたいに参照渡しで呼び出す方にoutやref修飾子みたいなのを明示的に書けるようにしてほしいわ
結果を引数の参照に代入することの欠点は一見してそれが参照渡しか分からないことにある
別に強制じゃなくていいからさ constなら区別する必要ないだろ
渡されたものを書き換えるなら生ポにすればよい >>798-799
これだな
「著作権侵害だから」という理由で「スクリーンショットを規制」するとマジで死ぬというのをかつて証明した実例がある
https://gunosy.com/articles/RImqe >>806
「だけ」で言うとフレームワークとかライブラリとかモジュールとか全部自作なら大変だな >>806 ( >>821 )
どんな言語でもっていう意味ね テンプレ嫌い
専門のライブラリ屋が書くのは良いけどてめーらは書くな >>816
ならvoid hoge(const int *const x)だな >>817
くだらない落書きCPU時間の無駄、保存するって?IOの無駄。
とか言い出しちゃうわけですか。 void hoge(const int &x)
初心者がたまにこうやって書いてるの見るわw >>827
描画やI/Oで非効率なことしてたら、intの受け渡しのこまけえ話なんかと比べて
冗談抜きに10億倍とか時間かかったりするんだから先にそっち気にしろってだけだけど
この話を必要な機能を削れって解釈する奴もいるんだな
リアルで思い当たりあるわ、なるほど勉強になった >>814
>参照の方が見易かったり、分かりやすかったりする事がある
http://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html
「彼が言うには、変数を参照しているのか逆参照しているのかがいつもわからなくなる、だから必ずポインタを使う。アスタリスクが思い出させてくれるから」 >>828
このスットコドッコイめ、「void hoge(const VeryBigClass &x)」は定石ぞよ >>830
out引数は参照でなくポインタってルールのプロジェクトは結構あるな
参照ならnullチェック不要とか言うやつもいるけどポインタにアスタつけて渡してくるからなんの安心材料にもなってない >>832
std::string &str = *(std::string*)nullptr;
なんて書くやつおるのか?
そもそもこの代入時の関節参照でfaultしないのが興味深い >>833
それを一行で書くキチガイはいないだろうけど、参照引数に対してポインタを逆参照して渡すのは普通にやるだろ
当然、それがヌルポだったら相手は死ぬ >>833
めっちゃclangが消し去りそうなコードw ぬるぽをデリファレンスした時点で未定義動作だから受け取る側はそんなもん考慮しなくていいし渡した奴が悪い
参照がnullptrかどうかチェックするコードなんか書いたところでコンパイラが最適化で除去しちゃうぞ 参照渡しにするとありがたいのは勝手にconst扱いになることだ
例: void foo(const char* p) { ... } // p自体はconstではない
void bar(const char& c) { ... } // 引数のどこにも非const要素が無い
ポインタで同じことをしようとするとfoo()は次のように書かねばならない
void foo(const char* const p) { ... } >>831
intをVeryBigClassに読み替えてご苦労様です
藁人形論法つうんだっけ?付き合いきれないわ 訂正orz、
△: 勝手にconst扱いになる
○: 勝手にアドレスがconst扱いになる
あと参照は同一の字面で変数の実体を差し換えられるというのが
ポインタより圧倒的に優れてゐる、すなわち
Foo::m_someDataをm_someDataとして直接参照する10億行のコードを書き直すことなく
FooWrapper::m_someDataに対する操作に差し換えることができる
ポインタではこれはできない(正確に言うと、プリプロセッサを悪用したらできる「こともある」が C++の例外なら発生しない
CPU例外なら発生する 整数はCPUレベルの例外が起こる
浮動小数は±∞かNaNになる WinならSEH例外をC++で捕捉できるんじゃないっけ ゼロによる割り算って、未定義の動作になるんじゃないか?
CとC++で、あるいは規格のバージョン間で違うのかもしれんけど、
とりあえずCの整数ではゼロで割ると未定義動作って資料を見つけられた。
規格に手が届く人の検証を求めたいところ。 言語としては未定義だけど一般的なコンピュータでは動作停止するかOSに落とされる 0割で動作停止するコンピューターなんて見たことないわ >>842
実は、浮動小数の場合は、例外を発生させるか、値をNaNやINFにするかを
CPUの制御レジスタのフラグ類などであらかじめ設定できるようになっている。
だから、0で割り算した場合に例外ハンドラを起動させるようにすることも
可能。 >>847
昔は有ったよ。
「0除算例外」という「割り込み」が生じるが、MS-DOS などの16BIT-OSでは
それをOSが処理しない場合があって、その場合は、アプリだけでなく、OS
まるごとハングアップしたり、再起動したりする事があった。 >>849
それエラー処理の問題でしょ
そんなこと言い出したら変な入力で動作停止するコンピューターだってゴロゴロしてるし w OSが安全に処理してくれてるだけでOSが無ければ止まるよ >>852
止まる?
単に暴走するだけだろ
組込みとかだと再起動とか アイドリングで止まってるか暴走で同じところを回ってるのとの違いでしかない
(発熱以外違いはない?) >>853
あなたのいう「暴走」の定義はなんですか?
ゼロ割のinterruptが発生したら然るべきルーチンを呼び出すだけなのでは?
それが何をするかは定義しだいだが、暴走!?みたいなことが発生することはないのでは? 突然始まるガベコレで長期間CPU占有されて
表面上使ってるひとには止まってると思われる状況は発生するし
一般人はそれを文字通り止まってるとみなすだろう >>856
最近のソフトで Full GC が走ってしまうことなんてあるのかな… 今ハード割り込みなんて気にするソフト書くとしたらOSがないやつだよね プロセスとして切り離しとけってアドバイスでこんなの終わりだろ。 >>855
OSがない環境だから処理ルーチンもないんだろ
詳しくは>>852に聞いてくれ >>856
こんなスレで一般人の感想を言われても… 一般人とか言い出すのはLinux板だけかと思ってた、ワロ。 ていうか今目の前にある環境でコード書いて試せばすぐわかることを聞いてくるやつは
エアC++ Visual Studioでコード書いても何もわからない。
とても都合よくできてるから。
こっちが標準になればいいのに。 ラムダ式がいまだに書けないし読めないんだけど
書きたくなるようなメリット教えてくれ C++を使うとコンパイラエラーで悩むことが多いがラムダは複雑そうなのに非常に素直だ。ラムダで問題がでることが一度もない。素直でできがいいと思うが残念なことに
そんなに使い道がない。 関数の内部で関数を定義できる。すなわち、例えばデカい関数からいちいちその関数の外側に注意を向ける必要が無くなる。 ■ このスレッドは過去ログ倉庫に格納されています