C++相談室 part145

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2019/09/13(金) 17:13:24.60ID:/ygW08Jq
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
2019/09/29(日) 10:02:14.52ID:sih8o/+S
>>192
そのくらいのプログラムでは名前空間は使わない方がいい。
使うべきなのはクラス。
2019/09/29(日) 10:24:44.95ID:MP9GBJ11
いや同じ識別子を違う意味で使いたいのなら名前空間だ
名前をどうかしたいというだけでクラス化するといらん制限がかかって邪魔なだけ
2019/09/29(日) 10:27:55.39ID:lvoGL429
>>192
その例では明らかにグローバル変数を使う必要はない。
「最小費用流を解くクラス」のメンバに押し込めるのが普通だと思われる。
2019/09/29(日) 12:21:02.27ID:xopwPRlT
名前空間は一連の処理や機能をライブラリとしてまとめるときに他のライブラリと名前衝突しないようにするためのものだ
minとmaxの違いだけなら名前空間分けずに変数名や関数名に直接反映させればいいのでは
2019/09/29(日) 15:27:39.30ID:sih8o/+S
>>197
個人的には自分もそう理解しています。
自分が作るプログラムでは namespace は基本的に使う必要はほぼ
有りません。古い時代に既に作ってしまったプログラムで名前が衝突して
困るような場合に使うと便利な機能として登場したのではないかと思っています。
2019/09/29(日) 15:31:08.94ID:MP9GBJ11
せっかくの回避策をマクロでばっちり透過してくれた素敵なマイクロソフトw
2019/09/29(日) 16:03:17.31ID:k4CvVXqN
>>198
昔作ったものに対してだけでなく、いま作ったものが将来使うときに名前の衝突を回避するという目的もあるぞ。
2019/09/29(日) 16:52:41.21ID:1aVYpaid
なぜ日本人c++プログラマの99%はstd::vectorもstd::find_ifも見たことすらないのだろう。
c言語風の生ポインタ、生配列、if文、for文のみを使ったプログラムしか読めない。
外国の人でそういう人は見たことがない。
2019/09/29(日) 17:03:09.76ID:bY9zxDl0
99%は盛り過ぎでは・・・
2019/09/29(日) 17:06:09.85ID:cKDPFQQS
>>201
ワイド文字知らん人見たことあるわ
2019/09/29(日) 17:28:35.45ID:TRtZnyIq
体感で8割ぐらいかな
まず規格があって改訂されてるってことも知らないのもいる

これは他の言語にも言えることだが
職場で使ったことのあるJavaやPHPのバージョンと環境がすべてみたいな
2019/09/29(日) 17:37:04.15ID:MP9GBJ11
>>201
おまえ豚小屋にでも住んでるのか?w
2019/09/29(日) 17:38:36.19ID:MCSEZmay
C++20に入るauto変数を使った簡易関数テンプレートは宣言と実装を分割してコンパイルできますか?
2019/09/29(日) 18:02:01.75ID:xopwPRlT
全部ヘッダーファイルに書いてしまえ
2019/09/29(日) 18:13:05.80ID:Lkb9fNY1
vector知らんのはいたとしても組み込みマンくらいだろ
2019/09/29(日) 19:02:41.77ID:bY9zxDl0
>>206
多分戻り値型と同じで、1つの翻訳単位内ならできると思う
宣言だけヘッダに書いたりするとautoのままだと呼び出せない
2019/09/29(日) 19:46:49.92ID:qdFsd7WD
>>208
組み込みマンはC言語だろ
C++使っててstd::vector知らないのは流石に勉強不足
2019/09/29(日) 19:56:43.66ID:MCSEZmay
>>209
ありがとう
やっぱだめか
2019/09/29(日) 21:36:43.15ID:MP9GBJ11
>>210
組み込みマンだからprinf知りませんみたいなもんだなw
2019/09/29(日) 21:44:06.01ID:xcXauKC9
vectorの存在は知っていても中身は知らんやつばっかだろ
いまだに生配列の方が速いとか言ってるやついるし
2019/09/29(日) 21:51:00.97ID:lvoGL429
まあ実際計ってる奴はそんなにはいないわな。
てきとうな演算するくらいなら配列だろうとvectorだろうとほとんど変わらん
(ただしコンパイルオプションによる。
O2 ならそんな変わらんが最適化しないとvectorは本当に遅い。)
2019/09/29(日) 21:57:52.25ID:OYiClG3B
まあ最適化有効にすれば、すればそこいらの玄人が生配列でごちゃごちゃ書くより速くなることが多いがな
2019/09/29(日) 22:09:42.47ID:7KCLRAec
サイズを変えない操作でvectorと生配列の効率に違いなんかないだろ
2019/09/29(日) 22:16:27.22ID:C35/CdkS
ただ最近のc++の最適化前提のスタンスはいただけないな
デバッグのためにデバッグビルド使おうとするが一桁二桁遅くなって実用に耐えないとか
問題再現できないとか多々あって困る
2019/09/29(日) 22:58:28.58ID:UVnMNq40
>>217
そういうのはコンパイラベンダに言わないと変わらないでしょ。
言語規格としては知ったことではない。
2019/09/29(日) 23:03:53.99ID:7KCLRAec
もし最適化の有無で速度の変わらないコードがあったとしたら、まず間違いなく人が読めるものではないだろうな
2019/09/29(日) 23:06:55.39ID:C35/CdkS
こういう開き直りのスタンスって何か固有名詞ついてなかったっけ?
マッチポンプではないし・・なんかなかったかな?
2019/09/29(日) 23:10:51.16ID:C35/CdkS
>>219
Cはコードはそこまでひどく遅くならないからね
2019/09/29(日) 23:28:02.53ID:bY9zxDl0
そのおかげで実行時の速度と抽象化した書き方の両立ができるのでまあ仕方ないのでは
2019/09/29(日) 23:34:47.03ID:C35/CdkS
仕事でやってるので仕方ないで済まないんですよね
かつ遅いところは自分達では手が入れられないところだったり
こういうところ共感できる人いないのかな
2019/09/29(日) 23:37:19.27ID:SfsnISLI
>>217
良いPC買え
2019/09/29(日) 23:39:36.92ID:C35/CdkS
>>224
10、100倍遅い問題がPC買い替えてなんとかなると思います?
あと使ってるPC結構いいスペックですよ
開発環境には金かけてくれる会社なんで
2019/09/29(日) 23:53:13.21ID:7KCLRAec
仕事でやってようと高水準言語とはそういうものなのだから仕方ないものは仕方ない
仕方ないで済まされないなら仕事をやめるしかない
仕事は不可能を可能にするものではない

そんなに最適化が気に入らないなら最適化なしでリリースすりゃいい
プロダクトとデバッグ環境が同一になる
2019/09/29(日) 23:55:18.86ID:lvoGL429
仕方ないで済まないのでc++使わずc使うっていう話だな。
そこまで無理してc++を使う必然性はない。
結局組み込み系で行われる判断というのはそういったものなんだろう。
2019/09/29(日) 23:56:29.88ID:SfsnISLI
じゃあ使わなければいい終わり
苦行を強いられているなら文句を言わずに甘んじて受け入れてくれうざい
デバッグができないくらい時間がかかるのであればデバッグ用にデータを減らすかデバッガを使わずにデバッグすればいいだけ
2019/09/30(月) 00:01:41.09ID:1t7BL5a5
c++の問題を指摘したら自分が否定されてる気持ちになる人ですね?
こういうのって何か固有名詞ついてましたよね?
心理学かなにかの
2019/09/30(月) 00:07:48.80ID:K1luVxXx
自分以外は仕事でC++使ってないと思ってるのかねえ
2019/09/30(月) 00:12:05.55ID:d3KN1ocd
C++の問題ではなく、トレードオフなものを両取りできないことに腹を立てている馬鹿の頭が問題
2019/09/30(月) 00:29:11.50ID:BjVWgoML
debugバージョンでもinline有効にすれば良い
2019/09/30(月) 00:41:06.86ID:BjVWgoML
gccなら-Ogとか使えば楽
234デフォルトの名無しさん
垢版 |
2019/09/30(月) 08:38:56.00ID:96lznZkD
>>217
問題再現できないのってUB踏んでるんじゃ...
2019/09/30(月) 20:10:40.43ID:m19D9tLr
c++ほどサンクコストに引っ張られる輩を作り出す言語はないだろうな。
2019/09/30(月) 20:22:13.77ID:H9c5jpU6
つまり他の言語は底の浅いオモチャ、と
2019/09/30(月) 20:56:24.52ID:m19D9tLr
そんな掘ってもしょうがないところが深くても邪魔なだけなんだよ。
2019/09/30(月) 21:49:42.53ID:A2h+ApYr
あっさ
2019/09/30(月) 21:53:05.92ID:eLbbGbO7
速度や効率を度外視すれば実はプログラミングはものすごく簡単になることが多い。
ところがそれだと劇的に遅くなってしまう。うまく工夫して書かれたプログラムの
所要時間を1とすると、何にも考えずに書かれたプログラムの所要時間は、
100兆位になることがある。そこまで極端でないにしても何にも考えなければ
100位にはなる。その意味で高速化を常に意識しながら組むことは結構
大切な事だと思う。特にアルゴリズム的な部分においては。
2019/09/30(月) 22:05:07.81ID:JjfJ0hCF
アルゴリズム的に改善できる話なら言語関係ないじゃん
2019/09/30(月) 22:28:45.63ID:29SpHEC8
固定少数が速いとかdoubleよりもfloatが速いとか割算は遅いから掛け算だとか色々な噂聞いたけど・・・

今時ほとんど変わらんよね?
2019/09/30(月) 22:34:03.50ID:/hygPyRQ
>>241
実際測ってみりゃいいよ
2019/09/30(月) 22:48:36.98ID:ypiuCBLp
その時のためのtemplateです。
2019/09/30(月) 23:07:55.69ID:ypiuCBLp
https://ideone.com/p9ISAq
これなんで通らんのやろう?
コード補完で読み切れないのはいいけど、コンパイラさんは読めても良いのでは?
2019/09/30(月) 23:15:32.33ID:d3KN1ocd
class A :public T...{
にすりゃ通る
2019/09/30(月) 23:19:40.15ID:d3KN1ocd
もしくは
struct A :T...{
継承元にアクセスできんのが原因
2019/09/30(月) 23:29:43.59ID:ypiuCBLp
>>245-246
あ、俺環だったか。
マジで通った。。。@vc

https://ideone.com/Eahhnl
2019/09/30(月) 23:42:29.68ID:ypiuCBLp
>>247
自分で作っておいてあれだが、なにに・・・つか・・・えるん・・・だ・・・。ぐああああ。
考えれば考えるほどもやもやする。
2019/09/30(月) 23:50:49.59ID:ypiuCBLp
ヴェーダに接続するときに使うんかいな。とかおかしなことしか思い浮かばねー。
2019/10/01(火) 10:39:26.07ID:SeWV7ZFb
>>217
この場合に A<B,C,D>とした場合、public T... の部分は、
public B, public C, public D
と展開されるんでしたっけ?
2019/10/01(火) 15:52:31.87ID:vnyPyC//
>>193-194,196
では、Edgeという名前の構造体の定義を問題によって変えたいときはどうすれば良いですか?
2019/10/01(火) 21:48:01.50ID:9tGbOXPW
>>241
今どきのプロセッサではdoubleは速いよ
doubleは専用チップ積んでるから。floatはdoubleに内部的に変換かけられるから、原理的にdoubleより速くはならない
2019/10/01(火) 21:50:51.00ID:sOAgszt0
いや、今時のプロセッサはSIMDで不動小数点演算するからdoubleよりfloatの方が速いよ
演算やプロセッサによるが、大抵2〜4倍差が出る
2019/10/01(火) 23:04:08.95ID:+hOGjxeQ
floatが早い今どきのプロセッサってGPUの話か?
ちゃんと区別しろ
2019/10/01(火) 23:06:13.36ID:geI6I9WY
直前の計算結果を次の計算で使うようなありがちな状況だと、SIMDじゃ一切早くならないのでは?よく知らんけど
2019/10/01(火) 23:06:54.09ID:sOAgszt0
x86とかも典型的だろ
doubleよりfloatの方が倍速いよ
最近はbfloat16の方がさらに速いまである
2019/10/01(火) 23:26:39.35ID:5ranOfZi
SIMDで1語で複数のfloat演算を並列にやったら早くなる
しかしコンパイラの最適化が普通はそこまでやってくれない
2019/10/01(火) 23:28:12.34ID:DRbEIshC
今はfloatのが速い
amd64出てからsse基本なので
昔とは状況が違う
2019/10/01(火) 23:28:49.51ID:DRbEIshC
>>257
やるけど
2019/10/01(火) 23:30:04.90ID:5ranOfZi
>>259
やるんか?
2019/10/01(火) 23:32:20.09ID:3zNRBOOL
>>253
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?

私は、コンパイラは fpu のコードしか吐かないじゃないか?って考えています
2019/10/01(火) 23:37:45.74ID:KZgN44vw
>>261
それはお前の頭が老害だから
2019/10/01(火) 23:39:09.19ID:84uW7JaU
速さ計測すればいいじゃん
逆アセンブル見ればいいじゃん
2019/10/01(火) 23:40:49.69ID:3zNRBOOL
>>262
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?
2019/10/01(火) 23:44:09.36ID:sOAgszt0
そもそもx64ではFPUは無かったことにされている
doubleやfloatの計算したかったらSIMDで1レーンだけ使って計算する仕組み
2019/10/01(火) 23:54:05.20ID:5ranOfZi
>1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速く
その条件だとどっちを使っても良い大して変わらん

やっぱループアンローリングできるぐらいループリッチな課題でないと意味が無い
https://www.isus.jp/products/c-compilers/compiler_part2/
https://cpplover.blogspot.com/2015/03/blog-post_30.html
2019/10/02(水) 00:10:27.89ID:eo8nmuYy
しかしコンパイラの最適化はイマイチっぽい
https://www.isus.jp/products/c-compilers/compiler_part4/
2019/10/02(水) 07:48:44.41ID:BafSfR+Q
>>265
いいえ x64 でも fpu コードは使えますよ、嘘はやめて!
2019/10/02(水) 07:54:44.99ID:Y2eIpMbX
>>228
こういうやつって何かしらソフト完成させたこともない初心者のクセしてイキってるんだろ
マジ邪魔だから消えて欲しい
テンプレート使ったコードで遅くなるというのがわからんならboostのspiritとか使ってみたらいいわ
言ってる意味わかるから
2019/10/02(水) 07:59:03.00ID:Y2eIpMbX
あ、もちろんデバッグビルドの話な
最適化ありならspiritは当然速い
2019/10/02(水) 08:01:33.95ID:sddCZQNP
C++を使わないと言っているやつに、どうぞご勝手にということと何の関係が?
2019/10/02(水) 08:22:40.25ID:QmwKmz4W
>>268
でもアセンブラで直接使わないと無かったことにされるだろ
2019/10/02(水) 08:29:18.29ID:0zoKeqvU
>>261
amd64でfpuコード吐かせるほうが手間じゃwwww
2019/10/02(水) 08:30:44.39ID:0zoKeqvU
そもそもプログラム中に一個か二個の浮動小数点演算なんて最適化ポイントちゃうがなwwww
自説を通すためにバカな例を仮定するアホに絡むだけ無駄やなw
2019/10/02(水) 11:21:30.36ID:iITLzrzf
>>272
プロジェクトの設定でfpも選べるよ
既定だとsse使われると思うけど
2019/10/02(水) 22:05:22.14ID:VK3sSC9+
コンパイラの種類変わったら算術演算ぶん回す場合は結構差が出るだろうけど、同じコンパイラでバージョンかわると最適化とかの進化で結構かわるのかな?
gccの3と4、msvcの2005と2017とかそういう違いで
2019/10/03(木) 04:57:05.82ID:vAL7lUst
質問です
既にクラスHogeとAがあり
クラスAとは別に新たにクラスBを追加することになった
BはA専用の関数が無く呼び出す必要も無いし逆のことは無い
その場合BにA専用の関数と同じ名前の空の関数を用意するか、呼び出されているHoge内で切り分けるかどちらの方が良いですか?
なおAは絶対に継承しなければならないし改変することもできない

class Hoge : A か class Hoge : Bをプリプロセッサかテンプレートで切り分ける

これを
void Hpge::func() {
  A_func(); //Bは持っていない
}

プリプロセッサで切り分けるのが良いのか
void Hpge::func() {
#if defined(USE_A)
  A_func();
#endif
}


それとも空の関数を書いた方が良いのか
class Hoge : B {
  A_func() {}
}

詳しい方がいたら教えていただきたいです
これ以外の賢いやり方があればそれでも大丈夫です
2019/10/03(木) 07:04:32.42ID:damPur2/
絶対に、の理由が知りたいところだけど、普通はA_funcを仮想関数にしてBは空関数でオーバーライド。
2019/10/03(木) 07:05:22.94ID:OJdSM3QH
c++17以降ならif constexprとstd::is_sameでできるんじゃない?
template < typename T >
class Hoge : T{
void func() {
  if constexpr(std::is_same<T,A>){ //基底クラスTがAであればA_func()を実行する
    A_func();
  }
}
}
2019/10/03(木) 07:12:55.92ID:OJdSM3QH
std::is_same<T,A> じゃなくて std::is_same_v<T,A> か
2019/10/03(木) 07:31:04.45ID:5EMHpFEj
>>278
HogeがAかBを継承するんだからそれじゃだめやろ
ただ設計見直したいところだけどそういうわけにもいかんのかね
2019/10/03(木) 07:54:23.64ID:r73Y/293
c++17が使えなくて、Bの定義を関係ないAのために汚染したくないなら一層増やせばいい

template<typename T>
class HogeBase;

template<>
class HogeBase<A> : A {}

template<>
class HogeBase<B> : B { A_func(){} }

template<typename T>
class Hoge : HogeBase<T> { /*...*/ }
2019/10/03(木) 09:13:02.91ID:r91xqmRv
>>281
なにか問題起きる?
2019/10/03(木) 11:57:14.92ID:z1c5xmGq
>>277
基底クラスを切替たいってこと?
しかも片方の基底クラスにしかないメソッドを派生クラス側で呼出すとかどんな状況なんだろう…
まあ、やっつけでやるなら素直にB側に空のメソッド追加しとけばいいと思うよ
どう見てもまともな設計じゃなさそうだし、かと言って設計を見直すこともできなさそうだしね
プリプロセッサなんて愚の骨頂にしかならん
285281
垢版 |
2019/10/03(木) 12:22:59.66ID:GJuckdYX
>>283
A_funcを持つものを継承するならオーバーライドが理想的だろうけど、基底がAかBってことだから無理っしょ
しかもAは書き換えられないときてる

すでに言われてるようにテンプレートで基底を指定させるか単純に空のA_funcを書くか、プリプロセッサか

でもそもそも利用者側がAを使うのかBを使うのか決めるのなら、クラス側で対処せずに利用者がプリプロセッサで分けた方がいいと思う(でないとぐちゃぐちゃになりそう)

それだと修正箇所が多すぎるのかもしれんけど
2019/10/03(木) 13:00:06.78ID:t4NBMq8s
こんなマトモじゃないケースに
ベストな解答なんかないわな
287デフォルトの名無しさん
垢版 |
2019/10/03(木) 13:00:33.56ID:YSTER/9m
>>284
Qtをdisってんの
2019/10/03(木) 15:51:04.04ID:z1c5xmGq
まさかと思うがQtを盲信してるのか?w
289デフォルトの名無しさん
垢版 |
2019/10/03(木) 16:04:15.58ID:LjcEi/T6
ちょとっ猛進
2019/10/03(木) 16:37:32.38ID:vAL7lUst
回答ありがとうございます
プリプロセッサまみれになるより空の関数生やした方が見通しよさそうですね
2019/10/03(木) 18:04:25.67ID:SL8wP/0a
>>288
え、qt便利じゃん
2019/10/03(木) 19:00:51.01ID:BEqWQnsI
旧版は知らんけどQt5はかなり良いと思う
不満に思うのはベンチ厨くらいでは
2019/10/03(木) 19:22:01.27ID:z1c5xmGq
>>291
便利かどうかなんて言ってないのにいきなりどうした?w
2019/10/03(木) 21:53:13.09ID:Uq6PP8Ux
コンパイル通らないので助けてください。
メンバテンプレートを持つクラスを継承して、派生先からメソッドが呼べません。
一見問題なさそうにはみえるのですが・・・

template<typename _T1>
class A{

public :

template<typename _T2> _T2 get() { return _T2(); };

};

template<typename _T3>
class B : public A<_T3> {
std::string hogehoge() { return A<_T3>::get<std::string>();}
};
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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