X



C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 3b96-ov1m)
垢版 |
2017/07/29(土) 11:28:28.97ID:o30VDF4g0
次スレを立てる時は本文の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
0339デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/26(土) 08:56:30.09ID:jcvKb5O50
>>336
言い争ってなんかいねえぜ
一部のアフォどもをこっちはスルーしてるんで争いになってない
0343デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/26(土) 19:44:51.20ID:dtKp7Pu80
>>342
あー左様かvoid B::f(int)のオーバーライドとf()のオーバーロードが同時にありえるのか、
完全に排他的(背反)というわけでもないな

ただしそれぞれ独立な概念とは言える
なぜなら下記の4通り全ての組み合わせが有り得、互いの成立要件に他方の成立の真偽が関係しないだから、
1. オーバーライド∧オーバーロード
2. オーバーライド∧¬オーバーロード
3. ¬オーバーライド∧オーバーロード
4. ¬オーバーライド∧¬オーバーロード
0350デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/27(日) 02:06:53.19ID:99717IEt0
みんな人に説明できるだけのまともな言語能力を備えてから来てくれ
あとクソみたいな反論をするのもやめよう
0353デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/27(日) 13:59:49.66ID:nap9vlyD0
constオブジェクトのデストラクタって
一般に中で非constメソッドを呼んでいるのに
なんで合法に呼び出されるの?
それとも合法に見えるのはVC++固有?
プロセスが死ぬまで破棄されないのが正しいロジックなんじゃないの
0354はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a15-2x4P)
垢版 |
2017/08/27(日) 15:08:55.59ID:hmah67i90
const の考え方には logical const と bitwise const があって、
logical const を実現するために言語としては bitwise const を基本として要求してる感じ。
logical const ってのは論理的な const 性で、
bitwise const ってのはビットパターンとして不変ってことね。

mutable キーワードを付ければ const なメンバ関数からも操作できるデータメンバを
作れるけど、これは bitwise const でなくてもよくなるだけで
logical const であることは要求される。
(その性質を満たすようにプログラマが配慮しないといけない。
コンパイラは面倒みてくれない。
reinterpret_cast と同じくらいには危険で面倒くさいと思う)

寿命が尽きたオブジェクトにはアクセスは許されないから
もはや logical も bitwise も関係なく const 性は無意味になる。
0355デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/27(日) 15:29:34.75ID:nap9vlyD0
>>354
>寿命が尽きたオブジェクトにはアクセスは許されないから
>もはや logical も bitwise も関係なく const 性は無意味になる。
これはだいたいワカタ

前半はわからん
bitwise const でないオブジェクトがROMに割り付けられたり、とか、
bitwise const でないオブジェクトがmemcpy()的手段で同じビットパターンに繰り返し上書きされるみたいな
処理があったりするとbitwise constでないことは致命的だが
それ以外のケースではconstといいつつクラス内部ではmutableな扱いであっても全く実害無いんじゃ…
ていうかそもそもC++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が、、
0356はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a15-2x4P)
垢版 |
2017/08/27(日) 16:21:07.86ID:hmah67i90
>>355
logical const であれば性質として充分だよ。
だけど、それをコンパイラがチェックすることは出来ないから、
原則としては bitwise const を要求して、
それがちゃんとできてなけりゃエラーも出す。

だけど、 bitwise でなくても logical に出来る場面では
プログラマの責任でやるよっていうのを mutable キーワードで表すってわけ。
0358デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/27(日) 16:50:02.45ID:99717IEt0
しかし現実には使われているもよう
0362デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/27(日) 19:19:01.73ID:+rBIMmXP0
>>359
いやいやおいおい…
0363デフォルトの名無しさん (オッペケ Sr6d-9IFt)
垢版 |
2017/08/27(日) 22:57:23.47ID:epttQBO0r
「C++の非PODオブジェクトに対するconstはbitwise constなのかかなり疑問が」
標準レイアウトではないconstexprなオブジェクトはビットレベルでconstなのだろうか
constexpr struct A { constexpr A()=default; int m=1; private: int n=2; } a;
確かに疑問だ
0364デフォルトの名無しさん (ワッチョイ 294d-vgeI)
垢版 |
2017/08/27(日) 23:06:36.65ID:Pcpci17F0
どんどんキーワードが増えるのは思いつきで仕様を決めてるからだ。
無能SEの下のプロジェクトではよくあること。
50年は仕様を追加しないつもりで仕様を決めてほしい。
0366デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/28(月) 00:12:36.48ID:OtmMiMVk0
永久に仕様が追加されない言語なんてたくさんあるから好きなのを使いなよ
機能が必要になった背景やそれを追加することが適当だという根拠まで知ってろとは言わないからさ
0368デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/28(月) 00:26:53.59ID:GiFa6ZsP0
つ、追加しなくても1.5年待てば倍速くなるもん…!

ていうかメモリバリア周りの扱いが未だに規格化されていないのは言語としてはお寒い状況だといわざるおえない
ゆくゆくはOpenMPIを正式に取り込んでキャッシュスヌープ無しのメニーコア環境でも
最高のパフォーマンスを発揮できるだけの選択肢をプログラマに提示し、
さらにはGPGPU対応もしてホスイ、
0370デフォルトの名無しさん (ワッチョイ 41e1-xc3z)
垢版 |
2017/08/28(月) 01:19:26.30ID:83bJD8zl0
openmpみたいなマクロまみれよりtbbのほうが好き
0371デフォルトの名無しさん (ワッチョイ 294d-vgeI)
垢版 |
2017/08/28(月) 01:23:37.61ID:JtlNpsV60
そんなに新機能を追加したいなら、新しく別言語を創れ。JavaやC#みたに成功して普及した事例はいくらでもある。
一度普及した言語に、碌に実務でコードも書いたことないような輩が後からやってきてデタラメな糞仕様を追加するんじゃない。
0375はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0a15-2x4P)
垢版 |
2017/08/28(月) 03:06:17.85ID:yPLR2tUq0
ライブラリの蓄積もあるからさ。 負債の蓄積とのバランスだよねー。
ときどき Go とか Rust とかみたいなのが出てきて一新してくれりゃいいんだけど、
C++ はともかく C はいつまでも死なない気がする。
0376デフォルトの名無しさん (ワッチョイ cac5-5mwo)
垢版 |
2017/08/28(月) 07:31:44.71ID:GiFa6ZsP0
別に新機能のほしいものリストを無秩序に書き連ねたわけではないもん;;
C++はSimulaの代替品として登場した時点から実行時パフォーマンスの追求を意識していたし、
理解しやすさなら他の言語を選択すればよい昨今においては
特に実行時パフォーマンスの追求こそがC++の存在意義として強調されるべき
テンプレートによるメタプログラミングに最高の効率を阻害する穴があれば塞がれねばならないし、
最適化がほっといたら中途半端にとどまるケースには尻を叩くキーワードが追加されねばならないし、
そのときどきのアーキテクチャーの詳細に立ち入ってでもあらゆる実行時パフォーマンス追求手段が
プログラマに提示されねばならない
インテリセンスがまともに働かないとかテンプレートの分割コンパイルがもはや完成しないバベルの塔だとか
言語規格が変わり続けて解説書が分厚くなる一方だといった側面の不調法はそうであってこそ許容される、
0379デフォルトの名無しさん (ワッチョイ ad09-tVhQ)
垢版 |
2017/08/28(月) 07:43:38.48ID:96+DvSIX0
>>377
機会が賢くなったら、あらゆる言語をCに一回トランスコ―ドするようになる気がする。
そこでパフォーマンスチューニングしてコンパイル。
人間だとコストかかってできない方法。
0381デフォルトの名無しさん (ワッチョイ ad09-tVhQ)
垢版 |
2017/08/28(月) 08:00:37.13ID:96+DvSIX0
>>380
あーそんなもんか。
それじゃ、アセンブリにした方が早いね。
もしくはあらゆる言語がLLVMを介してコンパイルされるとかね。
LLVMのストラクチャも自動生成とか。
あー怖い。
0382デフォルトの名無しさん (ブーイモ MMb9-E8CI)
垢版 |
2017/08/28(月) 12:49:34.85ID:0HhHgrwNM
ちょっとしたコーディングミスで、以下の簡易コードように書いてしまって、ハマったのですが、コンパイルエラーにならなかった事に驚きました。

string a(何らかの文字列);
string s = s.replace(置換指示); //a.replace() と書こうとした。

コピーコンストラクトの右辺に、構築中(?)の自分自身を使ってしまったと言う事なのですが、これは規格上合法なのでしょうか?
0383デフォルトの名無しさん (ブーイモ MMb9-E8CI)
垢版 |
2017/08/28(月) 12:59:59.78ID:0HhHgrwNM
↑のサンプル貼っておきます。
https://ideone.com/X4ILlf
0385デフォルトの名無しさん (スップ Sdca-vlGO)
垢版 |
2017/08/28(月) 16:57:17.16ID:KK7lC/68d
>>384
それの使い道がよくわからん

コンパイラと環境によっては x=0 より速かったりとか?
即値は全て名前を付けなきゃいけないとかいう糞コーディングルールの回避とか?
volatileをつけて、
ダミーリードと0クリアを1文で書けるとか?

思い付くのはこのくらい
0386デフォルトの名無しさん (ワッチョイ 4acd-Xu5m)
垢版 |
2017/08/28(月) 17:22:45.55ID:3VrqihWx0
コンストラクタが実行される前なのでオブジェクトの内容は不定だろうし
不定なオブジェクトにも適切にアクセスする場合なら合法かもしれない
ただ不定な変数を使って何かしようとすると途端に undefined behavior 地雷を
踏むことが多いのでそこで頑張っても実りがあるとも思えないけど
0387デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/28(月) 17:43:39.28ID:+dyqlMtL0
>>385
アセンブラでよく使う xor eax,eax を逆コンパイルするとアレになる
0391デフォルトの名無しさん (ワッチョイ b500-vlGO)
垢版 |
2017/08/28(月) 18:08:57.91ID:Wq6HqE7w0
さすがにPC系コンパイラで
0クリアを最適化しないのは無いかと

xor eax, eax は0イディオムとか言って、
普通のxorとは微妙に扱いが異なる

昔は sub ax, axより xor ax, axの方が微妙に速かったりした
今はフラグ以外は同じ

>>390
何もしないわけじやない
ちゃんとフラグが変わる
0396デフォルトの名無しさん (ブーイモ MMb9-E8CI)
垢版 |
2017/08/28(月) 19:37:58.17ID:y0vE8H3MM
>>382
質問を変えると、
何でコンパイルエラーにしてくれないんだろう?
ってところが気になっています。
0404デフォルトの名無しさん (アウアウウー Sa91-WCa5)
垢版 |
2017/08/28(月) 22:22:13.51ID:Na7nyTMka
そう言えば64bitアセンブラ勉強してた時ウェブで64bitレジスタでxor rax raxってするより、64bitプログラムでもxor eax eaxってした方が機械語短いって書いてたな。
アセンブラ上は同じ長さだけど、機械語上は64bit命令の方が長い&32bitレジスタへの操作は自動的に64bitレジスタの上位bitがゼロクリアされるから同じ動きになるとかなんとか。
キャッシュに入るコードが増えるから速くもなるらしい。
0406デフォルトの名無しさん (ワッチョイ 4a19-vgeI)
垢版 |
2017/08/29(火) 00:27:36.33ID:AHYNkT+D0
OpenMPIを用いたプロセス並列コードのプロファイルを取りたいんですが、
gprofだとテンプレートがごちゃごちゃしててすごく見にくいです。
何か勧めなフリーのプロファイラはないでしょうか?
0407デフォルトの名無しさん (ワッチョイ 3e23-tLez)
垢版 |
2017/08/29(火) 01:49:03.35ID:skpcufF70
座標を動的配列で格納していき、
(50,50),(100,100) //直線1の座標
(30,30),(70,70)  //直線2の座標
↑こんな感じに直線の数だけ座標の組み合わせが増えます。

この上から2個の座標の組み合わせ、
つまり座標4点を使い交点を計算するプログラムを作ろうとしています。

計算式を作っていく際にfor文を使っているのですが
1つ目の座標の組み合わせと2つ目の座標の組み合わせを計算式内で使うので
二重ループがいいかと思い作ろうとしましたが動的配列での二重ループの作り方が分かりません。

助けて頂けないでしょうか…。
長々と申し訳ありません。
0408デフォルトの名無しさん (ワッチョイ ca4c-oKtA)
垢版 |
2017/08/29(火) 02:17:37.67ID:On05DpTS0
>>396
void* p = &p;
↑こういうのは受け入れないといけない一方で >382 を NG とするための境目を
ちゃんと定めてコンパイラ実装するのはめんどくさそうだなと思う。
頻繁に踏む問題でも無くてコンパイラ実装者がそこに注力する動機も薄そうだし。
0409デフォルトの名無しさん (ワッチョイ c6ba-E8CI)
垢版 |
2017/08/29(火) 02:27:26.09ID:KA5Uf3Ix0
>>397
む、なるほど…
確かに未定義であれば、コンパイルエラーにしなくとも文句は言えませんね。

>>408
!!!なるほど!!!
実用性はさておき、その例文で納得してしまった。
0410デフォルトの名無しさん (ワッチョイ feea-w74m)
垢版 |
2017/08/29(火) 02:33:36.21ID:vHDkbJz50
>>407
動的配列だと何が問題あるの?
何につまずいているのかよくわからんなあ
例えばキューで実装するとか
直線をひとつづつプッシュ、
描画タイミングで直線を必要数ポップし交点を描画
0412デフォルトの名無しさん (ワッチョイ 3e23-tLez)
垢版 |
2017/08/30(水) 00:38:16.23ID:95r+Hm0D0
はい
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
といったような計算が出来るプログラムを動的配列でつくりたいです。
0419デフォルトの名無しさん (ワッチョイ 3e23-tLez)
垢版 |
2017/08/30(水) 08:57:17.67ID:95r+Hm0D0
>>415
通常のループも、二重ループもあらかじめ用意した配列でなら書けます

動的配列になるとiteratorの使い方が分からずプログラムが動かなくなってしまうのですが笑

>>416
ありがとうございます使ってみます!
0423デフォルトの名無しさん (ワッチョイ ad09-tVhQ)
垢版 |
2017/08/30(水) 10:44:38.77ID:VpX1ZCKl0
イテレータは繰り返しを前提としているので基本的に進むと戻るの操作しか提供しない。ランダムアクセスっていうのもなくはないけどね。
it++で前進、it--で後退。操作して、Container.begin()と同じ値なら先頭を、Continer.end()と同じ値になったらそのコンテナの末端を指している。
基本的にはポインタを抽象化したものだからポインタの操作を思い出すと少しわかりが早い。
0424デフォルトの名無しさん (ワッチョイ 29e4-xRau)
垢版 |
2017/08/30(水) 12:11:28.40ID:NGfIYJwv0
>>422
君には早いのでまずはポインタでぐぐってくれ
x[i + 1] == *(x + i + 1)
0426デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 12:35:06.14ID:BJd10UjW0
>>419
それ、end()が何を返しているかとか、
連続領域でないのにポインタを返しているとか
そういう系の問題じゃね?

あと「イテレータのループ」というのが
range-based-forだったりすると
x[i+1]はそもそも無理だぞ
0428デフォルトの名無しさん (ワッチョイ 0946-R9zi)
垢版 |
2017/08/30(水) 20:58:46.39ID:UeWdSpDY0
Cとjavaの基礎やったから基本の文法とオブジェクト指向の触りみたいな部分だけわかるんだけどこの状態でテンプレートとかの勉強初めていいの?
あそこらへん急に難しくなるイメージあるけど他に先にやるべきこととかあります?
あとそういう人におぬぬめの本とかもしあったら教えてくだされ
0436デフォルトの名無しさん (ワッチョイ 6f65-b8Mh)
垢版 |
2017/08/31(木) 05:33:17.64ID:5oi4R35S0
あのー、このスレに限らずどこもなんだけどさ、
初心者をケナスくせは、やめた方が良いよ。
ちょっと知ってる者の傾向だね。
ちょっと自分が物事を知ってるから、
「自分らが、上だ。と、知らない者をけなす癖」が多大に有るよね。
本当に知ってる者は、初心者にもやさしく教えてあげるよ。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況