C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part130
http://mevius.2ch.net/test/read.cgi/tech/1490917669/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/
■長いソースを貼るときはここへ。■
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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>355
logical const であれば性質として充分だよ。
だけど、それをコンパイラがチェックすることは出来ないから、
原則としては bitwise const を要求して、
それがちゃんとできてなけりゃエラーも出す。
だけど、 bitwise でなくても logical に出来る場面では
プログラマの責任でやるよっていうのを mutable キーワードで表すってわけ。 おい、mutableなんてキーワード初めて知ったぞw
ググってみたらC++11から導入されてたんだな知らんかった、、、 >>359
ANSI で規格化された最初から有ったがな (´・ω・`) 「C++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が」
標準レイアウトではないconstexprなオブジェクトはビットレベルでconstなのだろうか
constexpr struct A { constexpr A()=default; int m=1; private: int n=2; } a;
確かに疑問だ どんどんキーワードが増えるのは思いつきで仕様を決めてるからだ。
無能SEの下のプロジェクトではよくあること。
50年は仕様を追加しないつもりで仕様を決めてほしい。 コンピュータを取り巻く事情は予想の斜め上をいく形でどんどん変わるのに言語だけのんびりしとれるかいな 永久に仕様が追加されない言語なんてたくさんあるから好きなのを使いなよ
機能が必要になった背景やそれを追加することが適当だという根拠まで知ってろとは言わないからさ 雑魚に上から言われる筋合いはない。そんな態度だから囲まれて職質されるんだよ。 つ、追加しなくても1.5年待てば倍速くなるもん…!
ていうかメモリバリア周りの扱いが未だに規格化されていないのは言語としてはお寒い状況だといわざるおえない
ゆくゆくはOpenMPIを正式に取り込んでキャッシュスヌープ無しのメニーコア環境でも
最高のパフォーマンスを発揮できるだけの選択肢をプログラマに提示し、
さらにはGPGPU対応もしてホスイ、 スマンOpenMPIはOpenMPのつもりで言った! openmpみたいなマクロまみれよりtbbのほうが好き そんなに新機能を追加したいなら、新しく別言語を創れ。JavaやC#みたに成功して普及した事例はいくらでもある。
一度普及した言語に、碌に実務でコードも書いたことないような輩が後からやってきてデタラメな糞仕様を追加するんじゃない。 CとC++が同じ言語と思ってるとは、さすが見込みどおりの雑魚。 実務でコード書く人=Windowフォームにボタンを乗せる仕事の人 ライブラリの蓄積もあるからさ。 負債の蓄積とのバランスだよねー。
ときどき Go とか Rust とかみたいなのが出てきて一新してくれりゃいいんだけど、
C++ はともかく C はいつまでも死なない気がする。 別に新機能のほしいものリストを無秩序に書き連ねたわけではないもん;;
C++はSimulaの代替品として登場した時点から実行時パフォーマンスの追求を意識していたし、
理解しやすさなら他の言語を選択すればよい昨今においては
特に実行時パフォーマンスの追求こそがC++の存在意義として強調されるべき
テンプレートによるメタプログラミングに最高の効率を阻害する穴があれば塞がれねばならないし、
最適化がほっといたら中途半端にとどまるケースには尻を叩くキーワードが追加されねばならないし、
そのときどきのアーキテクチャーの詳細に立ち入ってでもあらゆる実行時パフォーマンス追求手段が
プログラマに提示されねばならない
インテリセンスがまともに働かないとかテンプレートの分割コンパイルがもはや完成しないバベルの塔だとか
言語規格が変わり続けて解説書が分厚くなる一方だといった側面の不調法はそうであってこそ許容される、 機械の方が人間より賢くプログラムするようになってアセンブラが滅びたら
Cも滅びる気がする ウニファイドコールシンタックスを直ちに入れるのです。
コードサジェストが爆発してもいいじゃない。 >>377
機会が賢くなったら、あらゆる言語をCに一回トランスコ―ドするようになる気がする。
そこでパフォーマンスチューニングしてコンパイル。
人間だとコストかかってできない方法。 中間言語とか3番地コードと条件判断とgotoで必要にしてほぼ十分なのでは… >>380
あーそんなもんか。
それじゃ、アセンブリにした方が早いね。
もしくはあらゆる言語がLLVMを介してコンパイルされるとかね。
LLVMのストラクチャも自動生成とか。
あー怖い。 ちょっとしたコーディングミスで、以下の簡易コードように書いてしまって、ハマったのですが、コンパイルエラーにならなかった事に驚きました。
string a(何らかの文字列);
string s = s.replace(置換指示); //a.replace() と書こうとした。
コピーコンストラクトの右辺に、構築中(?)の自分自身を使ってしまったと言う事なのですが、これは規格上合法なのでしょうか? x^=x でゼロになるんだっけ。
一応昔からある文法だけど。 >>384
それの使い道がよくわからん
コンパイラと環境によっては x=0 より速かったりとか?
即値は全て名前を付けなきゃいけないとかいう糞コーディングルールの回避とか?
volatileをつけて、
ダミーリードと0クリアを1文で書けるとか?
思い付くのはこのくらい コンストラクタが実行される前なのでオブジェクトの内容は不定だろうし
不定なオブジェクトにも適切にアクセスする場合なら合法かもしれない
ただ不定な変数を使って何かしようとすると途端に undefined behavior 地雷を
踏むことが多いのでそこで頑張っても実りがあるとも思えないけど >>385
アセンブラでよく使う xor eax,eax を逆コンパイルするとアレになる xor eax,eaxがゼロクリアで、
or eax,eaxが何もしない。 さすがにPC系コンパイラで
0クリアを最適化しないのは無いかと
xor eax, eax は0イディオムとか言って、
普通のxorとは微妙に扱いが異なる
昔は sub ax, axより xor ax, axの方が微妙に速かったりした
今はフラグ以外は同じ
>>390
何もしないわけじやない
ちゃんとフラグが変わる ttp://www.st.rim.or.jp/~nkomatsu/premicro/corezoom2.JPG
昔とはこういうスゴイ編み物の時代ですかね 編み物だって意味のあるつまらないことの積み重ねで実現されている。
プログラミングだって多分同じ。 コルモゴロフの最小プログラムに対しても同じ事が言える? >>382
質問を変えると、
何でコンパイルエラーにしてくれないんだろう?
ってところが気になっています。 >>382
3.3.2/1には反しないが3.8/6的にはだめだろう(たぶん)
未定義動作なのでコンパイルエラーになることは要求されていない >>391
それは x86/インテル方言なだけでは?
普通のアーキテクチャならばロードだけでフラグが変わるもんですキッパリ inline void zero_clear(int& x) { x ^= x; } そう言えば64bitアセンブラ勉強してた時ウェブで64bitレジスタでxor rax raxってするより、64bitプログラムでもxor eax eaxってした方が機械語短いって書いてたな。
アセンブラ上は同じ長さだけど、機械語上は64bit命令の方が長い&32bitレジスタへの操作は自動的に64bitレジスタの上位bitがゼロクリアされるから同じ動きになるとかなんとか。
キャッシュに入るコードが増えるから速くもなるらしい。 intel公式のドキュメントに書いてあるレベルだから
普通のコンパイラは当然そういうコードを吐くと思うよ OpenMPIを用いたプロセス並列コードのプロファイルを取りたいんですが、
gprofだとテンプレートがごちゃごちゃしててすごく見にくいです。
何か勧めなフリーのプロファイラはないでしょうか? 座標を動的配列で格納していき、
(50,50),(100,100) //直線1の座標
(30,30),(70,70) //直線2の座標
↑こんな感じに直線の数だけ座標の組み合わせが増えます。
この上から2個の座標の組み合わせ、
つまり座標4点を使い交点を計算するプログラムを作ろうとしています。
計算式を作っていく際にfor文を使っているのですが
1つ目の座標の組み合わせと2つ目の座標の組み合わせを計算式内で使うので
二重ループがいいかと思い作ろうとしましたが動的配列での二重ループの作り方が分かりません。
助けて頂けないでしょうか…。
長々と申し訳ありません。 >>396
void* p = &p;
↑こういうのは受け入れないといけない一方で >382 を NG とするための境目を
ちゃんと定めてコンパイラ実装するのはめんどくさそうだなと思う。
頻繁に踏む問題でも無くてコンパイラ実装者がそこに注力する動機も薄そうだし。 >>397
む、なるほど…
確かに未定義であれば、コンパイルエラーにしなくとも文句は言えませんね。
>>408
!!!なるほど!!!
実用性はさておき、その例文で納得してしまった。 >>407
動的配列だと何が問題あるの?
何につまずいているのかよくわからんなあ
例えばキューで実装するとか
直線をひとつづつプッシュ、
描画タイミングで直線を必要数ポップし交点を描画 Iteratorで2重ループするやり方がわからな
いとか? はい
iteratorでの二重ループが分かりません。
x1={1,2,3}
x2={4,5,6}
1*4 , 1*5 , 1*6
2*4 , 2*5 , 2*6
3*4 , 3*5 , 3*6
といったような計算が出来るプログラムを動的配列でつくりたいです。 >>412
まず通常のループは書けるの?
たとえばx2は4固定でいいのでループを記述してみたら? >>415
通常のループも、二重ループもあらかじめ用意した配列でなら書けます
動的配列になるとiteratorの使い方が分からずプログラムが動かなくなってしまうのですが笑
>>416
ありがとうございます使ってみます! >>419
つまり分からないのはイテレータのループそのもので、二重ループは関係ないということかな? perlのfor my $elem (@array){をやるのに何年懸ったんだろうといつも思う >>420
そんなかんじですね
たとえば、x[i+1]をiteratorのループではどう表現するのかとかそういうのが分からないとかです イテレータは繰り返しを前提としているので基本的に進むと戻るの操作しか提供しない。ランダムアクセスっていうのもなくはないけどね。
it++で前進、it--で後退。操作して、Container.begin()と同じ値なら先頭を、Continer.end()と同じ値になったらそのコンテナの末端を指している。
基本的にはポインタを抽象化したものだからポインタの操作を思い出すと少しわかりが早い。 >>422
君には早いのでまずはポインタでぐぐってくれ
x[i + 1] == *(x + i + 1) ポインタではループ書けませんって
なんかつき合う気失せるぐらい初心者やね
いやアンタが悪い訳じゃないんやが >>419
それ、end()が何を返しているかとか、
連続領域でないのにポインタを返しているとか
そういう系の問題じゃね?
あと「イテレータのループ」というのが
range-based-forだったりすると
x[i+1]はそもそも無理だぞ みなさんありがとうございます!
もっと勉強して出直してきます Cとjavaの基礎やったから基本の文法とオブジェクト指向の触りみたいな部分だけわかるんだけどこの状態でテンプレートとかの勉強初めていいの?
あそこらへん急に難しくなるイメージあるけど他に先にやるべきこととかあります?
あとそういう人におぬぬめの本とかもしあったら教えてくだされ >>428
まずテンプレートライブラリの使用方法を重点的に
自分でテンプレートを書くのは後回しにしたほうがよい >x[i + 1] == *(x + i + 1)
はて、いったい何の言語の話だろうか >>424
ポインタを意識させないのがイテレターだろうに
>>430
左辺と右辺が同じだって事が言いたいんだろうけど...
上に書いた理由でトンチンカンと言わざるを得ない >>422
it_next = it;
it_next ++;
とか >>432
意味がわからない
もう少しわかりやすく頼む
出来ないならもう発言しなくて良いから なぜにイテレータでやろうとするのか
valarray使えばこんなの即効だろ あのー、このスレに限らずどこもなんだけどさ、
初心者をケナスくせは、やめた方が良いよ。
ちょっと知ってる者の傾向だね。
ちょっと自分が物事を知ってるから、
「自分らが、上だ。と、知らない者をけなす癖」が多大に有るよね。
本当に知ってる者は、初心者にもやさしく教えてあげるよ。 >>432
>左辺と右辺が同じ
少なくともここはC++のスレで、C++では同じでないのだが何を言ってるんだお前は 知らない者を貶す気はないけど知ったかの頓珍漢な指摘は全力でバカにする また規格に自信ある奴が日本語読めてないな
日本語の文脈を理解できるようになってから発言してくれ >>437
C++でいつでも同じかなんてことはどうでも良い
レス自体トンチンカンなんだから 全くその通りだよね
ポインタ滅ぶべしとか思ってるのかも知れないけど、初心者はまずイテレータを理解してその後
ポインタを学べば良いなんてプロセスは効果的とは限らないし、個人的には無理があると思う。 C++使ってて初心者は隠蔽された中身を理解しなくていいとか本気で思ってる奴いるのかよ
それにイテレータはポインタのような操作ができるインターフェイスなのでポインタを理解してることは前提となっている 逆だよ。初心者は隠蔽された中身を理解しなくていい範囲と使うべき。
初心者に教えるときも注意しなきゃいかん。 >>443
イテレターを使う上で、ポインタを知らないと何が問題? 「あたかもポインタのように振る舞うオブジェクト」を使うにあたって
そもそもポインタを知らないことの何が問題か本気でわからないのか? イテレーターのコンセプト、理解してる?
ポインタのように振る舞う、じゃないよ。 イテレーションすることを目的にしてるけど、
ポインタもイテレータの機能を持ってるからポインタを想像するとわかりやすいっていうのはある。 >>447
どっかから引用したわけじゃないんで
そういうフレーズにはなってないだろうなあ
ポインタの使い方に、イテレータの使い方を似せてあるのは
誰の目にも明らかなんだが、おまえだけ違うのか?
重箱の隅でない説明がもしできるなら拝聴したいぜ ポインタに似せるというコンセプトではないので、ポインタと同じ構文で操作できてもポインタとは何の関係もありませ〜んwwww
そんな話してねえだろコミュ障か? イテレータの使い方がポインタの使い方に似せてある…?
もしかして、イテレータの意味わかってないんじゃないか?? >>451
はいはい
イテレータはポインタの操作方法と互換性がある
ただし静的配列やvectorで使われているランダムアクセスイテレータはすべての操作をサポートしているが、それ以外ではサポートしていない操作もあるので注意
とまで補足を入れたらいいんだろ
配列の話をしていたはずなのにアスペはすぐ話の腰折るから困る むしろ初心者ほど中身を知りたがるもの。
イテレータなんて実装が隠蔽されてるわけじゃなし、知った上で抽象化したらこうなるってのが妥当な方向だ。
コンパイラがやる最適化等とは別の話だ。 だいたいポインタの理解なんて義務教育レベルだしな。 ■ このスレッドは過去ログ倉庫に格納されています