C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

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

このスレもよろしくね。
【初心者歓迎】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/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/07/13(土) 21:44:17.10ID:2KEsM2Co0
マクロの定数(リテラルの定数)とconst/constexprって等価じゃないよね?
実用上はさておき
2019/07/13(土) 21:56:45.42ID:HW6onBjN0
定数は大体constじゃね?
ほかのアトリビュートかなんか推論できるか?
2019/07/13(土) 22:14:19.00ID:rtc9CxCA0
>>799
constexpr定数はマクロと同様にコンパイル時に置換されるから等価で、名前空間が使える分上位互換でしょ
802デフォルトの名無しさん (スップ)
垢版 |
2019/07/13(土) 22:43:26.97ID:BM5YZSOgd
constも定数としてだけ利用するなら多くの場合rom領域に置かれるはずなんだけど
constexprはコンパイル時置換が確定してるのとtemplateやconstexpr ifの恩恵受けられるのが大きいってイメージ
803デフォルトの名無しさん (スップ)
垢版 |
2019/07/13(土) 22:48:27.70ID:BM5YZSOgd
そういう話じゃねえなこれ
2019/07/13(土) 22:55:14.78ID:HY4jba3G0
lvalue-ravalue変換考慮に入れれば#defineの置換とほぼ同じになると思う
2019/07/13(土) 23:07:39.03ID:2KEsM2Co0
#define a 0
constexpr auto b = 0;
auto x = &a; //error
auto y = &b; //ok

等価ではないよね
だからdefine定数は必要と言いたいわけではないよ、念のため
2019/07/14(日) 00:38:21.57ID:MfUTAS3e0
>>801
#ifdefのように定義されているかどうか調べられないのが唯一の欠点かな。
2019/07/14(日) 02:32:37.43ID:Hni5ei2L0
foo[1].bar->baz.some_method()というのが1万箇所あってこれを
stdObj.some_method()と書きたい場合
#defineマクロなら
#define stdObj (foo[1].bar->baz)
で済むがconst系のやり方だとfoo[1].bar->bazのアドレスを取らねばならず、
コンパイル時の解決が不可能なケースが生ず、

んまーfoo[1].bar->bazをテンプレート引数に渡せば近代的な書き方もできるんだと思うが
2019/07/14(日) 02:43:00.83ID:Hni5ei2L0
あとVisual Studio 2010のC++限定の話かもしれんが

const struct Hoge someBigArray[50000] = { ... };

// 重複有り、規則性無しのsomeBigArray[]要素アドレスの引用
const foo_t* pA010001 = &(someBigArray[0].m_foo);
const foo_t* pA010002 = &(someBigArray[0].m_foo);
const foo_t* pA010003 = &(someBigArray[0].m_foo);
const foo_t* pA010004 = &(someBigArray[3].m_foo);
const foo_t* pA010005 = &(someBigArray[3].m_foo);
... (1万個ぐらい略) ...
const foo_t* pB019999 = &(someBigArray[9999].m_foo);

const foo_t foo_ptr_list[] = { pA010001, pa010002, ..., pB019999 };

というのをやったらDebugビルドだと20秒ぐらいでコンパイル&リンクが終わるのに
Releaseビルドだとリンクに10分もかかりやがるの;;;

しかし慌てず騒がずpA010001〜pB019999を全部#defineマクロにしたら20秒で終わるようになったわ、
2019/07/14(日) 02:48:10.57ID:Hni5ei2L0
プチ訂正
誤:const foo_t* pA010001 =
正:const foo_t* const pA010001 =
(pA010001 以外も同様
2019/07/14(日) 05:22:47.60ID:fukAtbQ2M
単に置換するのと文字列リテラルにして置換するのを両方できるのはマクロだけ
2019/07/14(日) 07:43:05.65ID:+8XuBzkV0
>constexprはコンパイル時置換が確定してるのとtemplateやconstexpr ifの恩恵受けられるのが大きいってイメージ
こういうことやるやつのコードは総じてクソまみれになるって事を考慮しないと。
812デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/14(日) 08:30:53.65ID:6widThLh0
メタテンプレ絶許マンか?
2019/07/14(日) 08:57:22.87ID:+8XuBzkV0
>>812
少なくともこういうバカ返信する奴のテンプレコードはクソ。100%クソ。
2019/07/14(日) 08:58:51.70ID:XaY0bL9/0
>>812
やーいばーか(´・ω・`)
2019/07/14(日) 09:03:55.82ID:kbgTNG980
わからないなら使わなくてエエんやで
2019/07/14(日) 09:28:25.48ID:9+vdQwS20
どの言語もテンプレはクソってことか
817デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/14(日) 09:30:59.65ID:6widThLh0
>>813
何を思い込んでいるかは知らないけれど
俺はテンプレコードなんて殆ど書かないので問題ないですね
818デフォルトの名無しさん (スップ)
垢版 |
2019/07/14(日) 09:50:06.90ID:N6Jg+9Qod
>>813
自己紹介かな
2019/07/14(日) 09:52:08.37ID:OwDd/gkk0
こういう奴の生ポインタをガチャガチャ引っ掻き回すコードはクソ。100%脆弱性入り。
2019/07/14(日) 10:21:40.78ID:Hni5ei2L0
ポインタや参照を使う奴がクソ
一般のプログラマ─はimmutableなオブジェクトしか扱わないべき
2019/07/14(日) 10:22:25.79ID:yqvJtNKTa
俺はクソだった!
2019/07/14(日) 10:46:18.68ID:6RRDIuRx0
クソでいいや
823デフォルトの名無しさん (スップ)
垢版 |
2019/07/14(日) 10:48:00.68ID:N6Jg+9Qod
そもそもC++書いてる奴は総じてクソ
2019/07/14(日) 10:52:11.91ID:kbgTNG980
たまにマジでテンプレート否定する奴がいるけどどういうコード書いてるんだろうとは思う
ならもうC言語でいいやんと
2019/07/14(日) 11:25:30.46ID:IlYB/IHkM
言語の機能否定するやつはもう消えろと思う
2019/07/14(日) 12:05:51.96ID:3jO2eFHc0
>>820
2019/07/14(日) 12:17:26.84ID:bTXRhkvlM
>>82
最近関数型言語かぶれ増えたよな
一時期のOO厨と同じ
というか実行効率重視しないのにC++使ってるまぬけでしかない
828デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/14(日) 13:03:52.75ID:t8pNnhD80
Template なかったら事前にタイプ規定する言語使うの最早ただの苦行やん...
2019/07/14(日) 13:07:41.55ID:Hni5ei2L0
増えたといっても全部漏れの自演だがな

やっぱ最適化とかmutableなオブジェクトの使用みたいな危険行為は
プロファイルをとった上で
ポイントを絞ってやるべき伝家の砲塔だと思うんですよねー
2019/07/14(日) 14:22:08.64ID:bTXRhkvlM
>>829
それテストドリブン原理主義と同じだよ
現実のC++のプロジェクトでワークしない

実際のとこお前だってそのポリシーでやりきったことないだろ
あるいはそもそも性能要件なんかないただの趣味プログラミングだろ
2019/07/14(日) 16:39:34.94ID:QM43l4Yx0
>>829
>伝家の砲塔
×
◎伝家の宝刀
2019/07/14(日) 16:58:06.88ID:Hni5ei2L0
ていうか真に速度が求められる箇所ではオブジェクトの生成とかせずに
テーブルで済ますように極力するから極限までの高速化を求められるシチュエーションでは
immutable縛りはあんまパフォーマンスの制約要因にならないキモス
2019/07/14(日) 17:21:37.08ID:Hni5ei2L0
で実行速度が求められるあまりmutableな書き方しかできない最たるもの(と一般に考えられている
再起が関係するアルゴリズムとかでも再起の深さが有限なら原理上FSMで表せるし
そうしたときに問題になるテーブルサイズも問題によっては問題固有の特質に着目して削減ができるので
深さとcurrent stateの2つぐらいのmutable要素だけでやれる
スゲー手間がかかるのであんま一般的ではないが
2019/07/14(日) 18:55:48.27ID:iENt936B0
なんかコンテストとか競技系の小規模な問題しかやったことない人間の匂いがする
2019/07/14(日) 20:58:42.72ID:VdcfVJxm0
画像処理用の画像クラスでimmutableとか最悪だろ。
2019/07/14(日) 21:04:10.52ID:kbgTNG980
宣言的プログラミング!
(実装詳細はライブラリにやってもらう)
2019/07/15(月) 00:35:07.20ID:MjmXYKrZ0
今時の性能ならフル描画しなおしでも結構なんとかなるぞ
2019/07/15(月) 01:11:27.79ID:md6OUoiD0
画像の書き換えまたはフィルタリングを
In-placeで処理したからといってなんか高速化になりましたっけ…
In-placeの方がキャッシュの有効活用にはなるかもしれんが
2019/07/15(月) 01:15:15.20ID:md6OUoiD0
In-placeの方がキャッシュの有効活用にはなるかもしれんが、
画像う処理とかデータサイズ>2時キャッシュサイズなので
もともとキャッシュのrefill上等な前提な印象、
つまりはIn-placeにしたからといって誤差の範囲内
2019/07/15(月) 04:45:28.21ID:timtx4iU0
ネーミングセンス糞すぎて俺のgithubアカウントに○○○Manegerとか○○○Analyzerみたいな名前のリポジトリが並んでるんだけどどうすればいい?
2019/07/15(月) 05:19:41.70ID:AcRJIuvS0
Manegerは恥ずかしい
842デフォルトの名無しさん (スフッ)
垢版 |
2019/07/15(月) 07:09:19.75ID:rgXkaLbtd
analyserとかちょー卑猥な響きだよね(´・ω・`)
2019/07/15(月) 07:35:25.61ID:ex33LrHm0
>>840
ネーミングセンス云々の前に英語をちゃんと勉強するべきだな
2019/07/15(月) 09:49:59.26ID:md6OUoiD0
○○○Manや○○○Analと短縮表記すれば良い
2019/07/15(月) 09:59:50.02ID:9PTNja4Sa
クラス名は長くして変数名を短くするのがいい
2019/07/15(月) 10:22:06.22ID:AcRJIuvS0
プロジェクト名の話だと思う
2019/07/15(月) 10:38:39.02ID:9PTNja4Sa
本当だ...
2019/07/15(月) 10:50:02.87ID:r7SsHRFS0
初心者前提なのだから1ピクセルずつ操作することを考慮しろ
2019/07/15(月) 12:31:46.06ID:md6OUoiD0
英語力という点では「登録する」(動詞)を「regist」だと思い込んでいるケースが
メジャーなライブラリでも散見さるる、
2019/07/15(月) 12:37:01.83ID:fHVeR6bP0
あれ本当に恥ずかしいからやめて欲しい
恥ずかしいと思ってない日本人が多すぎるという事実自体が恥ずかしい
2019/07/15(月) 12:37:18.11ID:Xch0qlQL0
それはconfigureをconfigって略すのと同じだろ
2019/07/15(月) 12:40:40.78ID:r69UXvdn0
恥ずかしい人がここに
2019/07/15(月) 12:40:47.47ID:AcRJIuvS0
registerが名詞だと思ってるのか
2019/07/15(月) 12:46:03.84ID:timtx4iU0
>>841
誤字だと分かりきっているものを茶化さないでおくれ
2019/07/15(月) 12:47:25.64ID:fHVeR6bP0
本当に省略形なら"registed"だの"registing"だの"registation"だのはどう説明付けてくれるんだろうね
2019/07/15(月) 12:53:03.24ID:+RJOjipn0
おっウォーニングの話か?
2019/07/15(月) 13:01:38.24ID:lxHurSyi0
エンカウントとか?
2019/07/15(月) 13:31:00.46ID:ex33LrHm0
>>853
registerは名詞でもあるだろ
ただ意味が限定される(帳簿とかこの業界だとCPUのレジスタとかになる)ので登録という意味ならregistrationの方がいい
2019/07/15(月) 14:00:46.85ID:P+OOoIdTM
warningとかもなるべく正しい(近い)発音を心がけてるんだけど
nullだけはヌルだわ
2chリスペクトだと思ってるw
2019/07/15(月) 14:06:27.37ID:Nn+acajv0
>>849
resist と書かれちゃうよりはましだとおもいますぅ
2019/07/15(月) 14:07:48.53ID:Nn+acajv0
>>859
ドイツ語ではヌルでいいんですよ、ドイツ語と言い張ればいいのではないでしょーか
2019/07/15(月) 14:15:07.13ID:P+OOoIdTM
なるほど
ヌルポはヌルポッセンドルフの略と思っておきます
2019/07/15(月) 14:18:25.23ID:r7SsHRFS0
nullはむしろ英語読みが間違っている

外来語導入して読み方変えているのを間違いと言うなら
2019/07/15(月) 14:23:34.76ID:reKP8a27M
大規模開発やったことないんだけど、C++の仕事ってやらせてください
2019/07/15(月) 14:25:17.59ID:timtx4iU0
自分で仕事を作れば何でもできるよ
2019/07/15(月) 15:22:17.78ID:vaP/RuJr0
正直、メモリ管理もできないような言語の仕事なんか限定されすぎだろうよ。
ゲーム業界くらい?

俺は一応社内システムの仕事でやってるけど、 c++の機能フルで使えないからストレスだわ
c言語のソースそのままコピーしたであろう共通関数あったり、既存ソースはポインタ生で使ってたり、 コンパイラーがc++03だったり、boost使えなかったり、微妙
2019/07/15(月) 15:55:13.08ID:J3bo3XLhp
その程度でぶーたれてんのか
入って半年とかか?
868デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/15(月) 16:11:03.46ID:ioQvo5hA0
俺もナマポ暮らしになりたいわ
2019/07/15(月) 16:35:55.59ID:TrI7uaVY0
規模次第だけど社内システムなんて結構好き勝手できるから気に入らない部分はどんどん新技術に載せ替えて行けば?
2019/07/15(月) 16:55:43.24ID:timtx4iU0
デスクトップアプリもスマホアプリも当然C++
2019/07/15(月) 17:05:26.06ID:71Nm6o/V0
boostいらんわ
2019/07/15(月) 17:08:12.98ID:timtx4iU0
プロジェクトのひな形を生成したときにまずすることはboostのパスを入力すること
2019/07/15(月) 17:26:52.36ID:qXQUtn8qM
vcpkg install boost:windows-x64
2019/07/15(月) 17:49:20.12ID:timtx4iU0
x64-windowsダルォ?
2019/07/15(月) 18:05:18.40ID:vaP/RuJr0
>>869
しがないフリーランスだからその権限がないっす。
親方が気に入らなければ変えられません使えません。
俺「これーcharじゃなくてstd ::stringにした方がシンプルじゃないっすかねー・・・」
敵「既存がそうなってるからchar使ってね」
俺「はい」
2019/07/15(月) 18:39:11.23ID:1J86p0R40
>>875
ちゃんと相手にわかるメリットを示せよ。実装にかかる時間とか安全性とか信頼性とか、あるだろ。
無いなら既存に合わせるのが正解だろうよ。
2019/07/15(月) 18:48:34.62ID:oc4A+BFp0
>>876
既存のやり方がそうであるのに、流石にそれは許されないでしょ
2019/07/15(月) 18:50:01.71ID:timtx4iU0
「正しい」形にすることは何よりも優先されることなんだが
2019/07/15(月) 18:55:19.89ID:TrI7uaVY0
>>875
そういう案件ならしゃーないんじゃない?
上が細かな技術的なとこまで意思決定権持っちゃってる残念な現場なんて腐るほどあるんだし
説得して環境を変えるのもありだけどフリーで入ってるなら頑張ったところで将来的に得するかは微妙だろうね
2019/07/15(月) 18:55:25.91ID:ex33LrHm0
何が正しいかはケースバイケース
保守する社員がcharしか理解できないボンクラと言うことも考えられる
2019/07/15(月) 18:55:44.39ID:Voexy70f0
>>878
関係者がみな納得できる共通の「正しい」があるならそれでいいと思うよ
2019/07/15(月) 19:05:04.52ID:vaP/RuJr0
>>879
まさにそうなんだよねぇ。
「\0飛んだだけで暴走するcharなんか捨ててしまえ」って熱弁して血反吐吐いて納得させても将来得するの俺じゃねぇし・・・って言う
883デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/15(月) 19:29:53.08ID:uSWgDnpR0
>>882
説得先も大概だけどそんな理由で入れ替え勧めたってウンとは言わないでしょ…
2019/07/15(月) 19:30:09.25ID:uSWgDnpR0
ageてしまったごめんなさい
2019/07/15(月) 20:04:45.07ID:pjR6BG980
char*とstd::stringを比較するんじゃなくて、スタックとヒープの違いで安全性・安定性をアピールしたほうが良かったんじゃないかな。
2019/07/15(月) 20:13:41.55ID:MjmXYKrZ0
別にインターフェイス部分だけcharで内部ではstring使えばいい話だろ?
まあ多分インターフェイスなんて概念自体なさそうな現場には見えるが。
2019/07/15(月) 20:28:18.61ID:7B/nougm0
>>875
メリット説得して、さらにstringに馴染みがないやつへの説明
さらにその変更によって万一(どころではないと思うが)生じた不具合に対する責任を負う覚悟があり
それら全部タダ働きでいい、というのならOKしてくれるかもな
2019/07/15(月) 20:32:17.87ID:fPWDFa890
>>880
数年後に保守する奴が新人ってケースは普通にあるからねえ
2019/07/15(月) 23:10:03.23ID:MjmXYKrZ0
てかこのレベルでグダグダならc++なんて一番使っちゃいけないものなんだけどね。
2019/07/15(月) 23:18:29.56ID:pvtIibLv0
>>886
でもさ、どのメモリに入ってるかも分かんない文字列ポインタなんか、使いたくねーってならないか?
2019/07/15(月) 23:30:06.80ID:oc4A+BFp0
>>889
C++使っちゃいけないとか、C++使ってるやつは自意識過剰のクズばっかだな
Linusも言ってたし
2019/07/15(月) 23:37:28.29ID:+RJOjipn0
むしろchar使ってる箇所stringでラップして新人さんにもメンテしやすくするべき
893デフォルトの名無しさん (スフッ)
垢版 |
2019/07/16(火) 01:26:16.84ID:0uDObdGpd
クソなところならどうせそこ直しても所詮うんこの一角だしクソなだけ
いいところなのになんだかなー思うんなら訴えかけて良くしてやればいい
クソなところなんてどうせ金も払わんし出来る限り関わりを持たずにずらかるのが一番(´・ω・`)
2019/07/16(火) 06:17:44.96ID:osN3S5RL0
>>892
>>887
2019/07/16(火) 16:19:36.53ID:Df6fhjhOM
C++で個人開発したいんだけど、やりたいものが思いつかない
個人的にはC++らしいものをやりたい
→openGL
やってはみたけど、webのレイマーチングにはまる
→レイトレーシング
今もやってる趣味ではある
→競プロ
人生で一番費やしてるプログラミングの趣味
2019/07/16(火) 20:27:49.59ID:Z97hyaL80
test1 = 0x0123¥ntest2 = 0x0111¥n......
みたいなstring文字列から、指定のtest番号の0x0123みたいな6文字を取り出す関数を作りたい
引数をstring型文字列、戻り値を16進数のstring文字列みたいな

test1 と = の間のスペースの数が1つなのか複数なのかがランダムだから、それを考慮してうまく抜き出す方法ないかな?
(test1って名称が本当は別の文字列だから、見映えよくするためにスペースで調整されている)

regexを使った正規表現しかないかな??
今は指定の文字列をfind検索して、指定の文字列+1の位置から、全部文字列切り取って、スペース= 0x0111¥n.....みたいな文字列を一度作ってからさらにfindでやってるのだけども
2019/07/16(火) 20:50:39.00ID:nqFwpBh+0
>>891
通常の開発は一人でやるもんじゃないんだよ。
自分はできるからですませてるうちはプロジェクトではゴミだから。
2019/07/16(火) 20:51:55.23ID:LY1lZd1g0
>>896
まずスペースを削除すれば
2019/07/16(火) 21:01:39.66ID:IKrvu7vGa
>>896
面倒なのでregexに1票
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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