1 名前:デフォルトの名無しさん [2022/02/19(土) 11:56:42.14 ID:kSnJ/KwP.net] 前スレ C++相談室 part158 https://mevius.5ch.net/test/read.cgi/tech/1636969758/
232 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 23:13:07.22 ID:aDhOSI3t.net] JavaScript程度はブラウザのカスタマイズしたり含めて誰でも使える言語だろ まさかC++しか使えない新人かね
233 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 00:15:34.77 ID:VmHIkvc0.net] Pythonにはconstもprivateもない 大文字だけの名前はconst、アンダースコア始まりの名前はprivateという規約があるだけ でもそれでみんな勝手に書き換えるべきでないと了解されてて完全に成立してる とはいえ言語機能ではないのでテストとかでの必要に応じて規約を無視して値を変えることもできる こういう実例を見るとわざわざコンパイラ機能として書き換え禁を強要してるconstやprivateは偏執的過ぎると思う
234 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 00:23:17.69 ID:xDf2Ellb.net] 小さいオブジェクトにconst付けるとアドレスが割り振られて最適化が阻害されるみたいな話は聞いたな
235 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 01:13:30.79 ID:fRC8OZTs.net] 日付が変わってまた湧いてるw >>229 pythonみたいなゆるゆる言語と比較してconst/privateがないとかw >>230 その話URLで示してw
236 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 01:14:41.41 ID:TNmFLFGs.net] ここまでconstつけると最適化されるという例はなし。
237 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 01:39:20.96 ID:fRC8OZTs.net] ここまで何を調べたかの記述なしw
238 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 04:01:53.50 ID:L9ZaKHY5.net] move、右辺値参照、各種オペレータなどフルセットで対応するライブラリ的なクラスならconst対応した方が良いけど、 末端のアプリケーションにまで全部律儀にconst付けるのは面倒くさいだけだわな
239 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 04:13:27.79 ID:fRC8OZTs.net] そんなしょうもないものならわざわざC++で組むなよw 発想がアホの極みw
240 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 06:30:02.19 ID:BX4iLvdt.net] Rustなどは無指定デフォルト時がC++でのconst状態になってるよな 楽でいいよな
241 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 07:05:16.24 ID:fRC8OZTs.net] >>236 Rustの話はRustスレで
242 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 08:03:06.09 ID:w5NWCXyu.net] 話題に沿ってるんだし少しくらいなら良いと思うけどね。アレルギーかよ
243 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 08:11:23.88 ID:fRC8OZTs.net] Goスレ見てると対岸の火事とは思えないw Rustスレは静かなのに、そこで議論できない馬鹿がずっと他言語スレでRustのヘイトを稼いでるからなw Rustくらいみんな知ってると言うのにw ってわけで、特に今は各言語固有スレではその言語の話だけってことw
244 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 10:47:22.97 ID:w5NWCXyu.net] 他所のスレのことは知らんけどこれをヘイト稼ぎと受け取るのは捻くれな気がするけどね Rustのことも自分が知ってるからってみんな知ってるとかイキるのも良くない 知らない人だって当然いるだろうに
245 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 11:00:37.71 ID:fRC8OZTs.net] ヘイト稼ぎと解釈しない方が捻くれてるだろw 今どきC++やっててRust(やそれ以外の言語)知らん方がレアだし、その程度のやつは何を言われても仕方ない
246 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 11:24:01.42 ID:Cjy1TnYX.net] その程度とか言い出した パソコンの大先生かな?w
247 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 11:56:13.77 ID:w5NWCXyu.net] 誰でも最初は初心者なんだけどね ここオンラインの匿名掲示板なの忘れてない? 勝手に自分基準のレベルを周りに押し付けられてもね そういうのは自分の納得できる閉じたコミュニティでやればいいと思う
248 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 13:03:43.12 ID:d8NXRVNx.net] いや、悪いけど>>241 はレベル低いと思うよ・・・w
249 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 13:14:24.08 ID:qsPBexON.net] 自動販売機のタバコじゃないんだけどね もっと高級なのね
250 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 15:44:44.33 ID:xDf2Ellb.net] Rustってまだ言語マニアくらいしか使ってなくね そもそも案件が少なすぎるしRsutでしか提供されていないライブラリやフレームワークやSDKなんて聞いたことないし 俺が知らないだけで実はコッソリ出現してるのか???
251 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:06:22.23 ID:aW9KNPN/.net] 実際こうやってアレルギー反応(スレが荒れる)起こすからよその話はよそでやれってことだな
252 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:11:54.75 ID:fRC8OZTs.net] 荒れてねーよw
253 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:19:40.75 ID:4mZJSMD8.net] >>246 色んな分野でRustがC++の立ち位置を侵食していってるよ 例えばブラウザ内だけでなく今は色んな所で使われるようになったWebAssembly(WASM) WASMでプログラミングするための記述言語は当初C++が先行していたけど今はRustが逆転してトップになっているね
254 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:27:10.15 ID:I1qWxMaG.net] constさいこー 固定文字列リテラルとか const char* const s = "Hello World!\n"; やし 関数の仮引数は関数内で絶対変えないことにして void foo(const char* const p); // 宣言 void foo(const char* const p_) { // 定義 const char* p = p_; // 関数内で値を変える場合 } と書いてしまうま
255 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:27:29.83 ID:I1qWxMaG.net] だいたい https://mevius.5ch.net/test/read.cgi/tech/1524746903/652 https://mevius.5ch.net/test/read.cgi/tech/1524746903/659 と質問したら https://mevius.5ch.net/test/read.cgi/tech/1524746903/661 やそうやし\(^o^)/
256 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:46:27.37 ID:I1qWxMaG.net] テストのときにprivateメンバを弄りたいケースは確かにあって そういう場合は次のどれかかが多いう気がする印象だが知らん ※個人の感想です 1. 長ったらしい接頭辞がついた名前のテスト用メソッドを設けてその中にテストコードを書く リリースコードでもそのままだが呼ばれないからリンクはされない 2. 長ったらしい接頭辞がついた名前の構造体として実装して細かいテストしてclassでwrapしてリリース 3. 長ったらしい接頭辞がついた名前の普通の関数として書いて細かいテストしてそれをclassから呼ぶ
257 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:47:36.31 ID:fRC8OZTs.net] >>249-251 こういうのが荒れてる状態
258 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 22:48:11.64 ID:fRC8OZTs.net] >>252 これもな
259 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:14:01.86 ID:I1qWxMaG.net] だいたいインターフェースにもconstつけちゃう class IFoo { int bar(const int x, const double y, const RECT z) const = 0; double baz(std::string& buf) const = 0; /*...*/ }; とか
260 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:14:57.75 ID:I1qWxMaG.net] virtuarl ~IFoo() { } を忘れたorz (死
261 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:17:36.73 ID:TNmFLFGs.net] 値渡しをconstにして何がしたいん?
262 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:27:30.26 ID:w5NWCXyu.net] 固定ならconstexpr使おうや
263 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:36:20.44 ID:I1qWxMaG.net] >>257 文字通りconstにしたいのですヽ(`ー´)ノ 引数に再代入するのはガイジのやることなので(>>251 で関数定義でそうしたら、作業性のためにそれをコピペして極力弄らずにヘッダファイルにするから 宣言においても値渡しの引数にもconstが付くのでつ∀`;)
264 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:43:30.97 ID:w5NWCXyu.net] まあ非参照型でconstついてなかったらとりあえず ひょっとして関数内で書き換えられるんかと疑ってかかるよね
265 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:44:54.89 ID:I1qWxMaG.net] >>232 IPAコーディング左方ガイド[C++言語編] (p.120) https://www.ipa.go.jp/files/000055043.pdf >M1.11.1 参照しかしない領域は、const 型であることを示 >す宣言を行う。 (中略) >参照するだけで変更しない変数を const 型で宣言することで、その変数を変更しないことを明 >示できる。また、処理系の最適化処理でオブジェクトサイズが小さくなる可能性もある。この >ため、参照しかしない変数は const 型にする。 やそうや;;; 具体的には知らん
266 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:45:14.56 ID:nPeFYJEF.net] 引数に再代入するかどうかは呼び出し側の与り知らぬところなんで それを公開インターフェースに乗せるのはどうかなぁ。
267 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:45:57.76 ID:BX4iLvdt.net] Rustだと値渡しだけでなく参照渡しも無指定デフォルト時は書き換え不能だよな 書き換えが起こる関数へは指定して可変参照を渡す
268 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:48:32.78 ID:UUNvHcAJ.net] どこぞの馬の骨とも知れないIT後進国ジャップが言う事よりも天下のGoogle様のコーディング規約を真似るほうが無難だぞ そしてGoogleのコーディング規約によると「可能な限りconst付けまくれ」との事 実際にGoogleが公開してるライブラリはCにしろC++にしろ関数の引数から大体const付いてる、ポインタは勿論constバーガーで
269 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:50:44.52 ID:I1qWxMaG.net] >>262 あずかり知らぬことならどうでもいいんじゃ…… コピペした後手作業でconstを消すとかアフォらしい漏れクラスの天才の単金は高いからな やっぱ作る方の作業性優先で、 記憶モードだがVC++のインテリセンスは値渡しのconstは除去して提示してくれるはず……
270 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:58:24.50 ID:nPeFYJEF.net] でもconst書く方の手間は惜しまないんだ
271 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 23:58:37.20 ID:Cf/OFvAp.net] > 処理系の最適化処理でオブジェクトサイズが小さくなる可能性もある。 > int bar(const int x, これをどうやって小さくするんだ? そもそもconstの値渡しの話だよな。
272 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 00:02:08.66 ID:/TAxLK2K.net] >>264 へぇ〜知らなかったわこれ 流石ゴーグル様やで
273 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 00:02:10.22 ID:o7kRBzLD.net] 引数で明示的に書き換え禁止にしたいということはポインタ渡しか参照渡しだよな。 アドレスしか渡してないのに最適化でオブジェクトサイズが小さくなるというのはどういう意味だろう?
274 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 00:05:12.18 ID:o7kRBzLD.net] > 「可能な限りconst付けまくれ」 自分で設計、コーディングができなくてオープンソースをパクる側の意見だろう。 あくまでパクりすぎて訴えられて負けるググルくんの意見。
275 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 00:07:37.55 ID:KWP91+7v.net] char*ならアドレス渡すより実値渡す方がサイズ小さくて済むとかじゃない?知らんけどね
276 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 00:14:47.59 ID:/TAxLK2K.net] >>269 値渡しだとしても関数内で決して書き換えませんよって意思表示でconst付けるん
277 名前:だわ 使う側はどうでもいいのかも知れないけど少なくてもメンテ側はその方が楽 [] [ここ壊れてます]
278 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 00:39:11.54 ID:GNkMbU6V.net] 実質in宣言だよね
279 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 05:41:24.49 ID:+yReYAPt.net] まだ馬鹿がconst不要とかアホなこと言って荒らしてるのか・・・
280 名前:デフォルトの名無しさん [2022/02/27(日) 07:45:11.01 ID:hjaMvOv0.net] もういっそのこと、constをメンバ関数宣言のデフォルトにして、volatileキーワードをメンバ関数宣言にそえないとメンバ変数の値を変更できないような仕様変更をしたほうがいいくらいだよ
281 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 07:54:46.50 ID:XiobTp3y.net] ラムダ式の値キャプチャはデフォでconstだね constつけたくないときはmutable
282 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 13:50:59.05 ID:i/FBvdzu.net] 勝手な憶測だけどconst付けると即値埋め込み以外にもどの変数をレジスタに入れるかって辺りの最適化が効きやすくなりそうな気はする
283 名前:デフォルトの名無しさん [2022/02/27(日) 14:21:10.71 ID:ai7feBss.net] class ClassA { public: int x, y; ClassA(int n1, int n2) { x = n1, y = n2; } virtual void VirFunc() = 0; }; class ClassB :public ClassA { public: ClassB(int n1 = 0, int n2 = 0) :ClassA(n1, n2) { ; } void VirFunc() { cout << "Disp1:x+y=" << x + y << std::endl; } void Dummy() { ; } }; void check(ClassA* obj) { if (typeid(*obj) == typeid(ClassB)) { static_cast<ClassB*>(obj)->VirFunc(); } } int main() { ClassB objB(10, 20); check(&objB); }
284 名前:デフォルトの名無しさん [2022/02/27(日) 14:21:28.24 ID:ai7feBss.net] クラスの継承やtyoeidで今躓いています。 objにclassBがなんで代入出来てなんでキャストできるのかわかりません。 check関数の中の引数、ClassAのポインタにClassBで実体化したオブジェクトのアドレスを入れると言うことは 継承した部分だけを見ることで同じ型として見ているのですか? だとしたら派生先のクラスでできたメンバ?がどうなるんだろうと言うのもわからなかったりはします。
285 名前:デフォルトの名無しさん [2022/02/27(日) 14:22:00.29 ID:ai7feBss.net] すみませんコードってどう上げれば良いんでしたっけ?
286 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 14:34:30.92 ID:57HjD/n9.net] const の必要性ってこういうときにあると思ってる struct T { int x; int y; T(int _x,int _y):x(_x),y(_y){}}; int test1(T &a){ return a.x*a.y;} int test2(const T &a){ return a.x*a.y;} int main() { T a(10,5); printf("%d",test1(a));//OK printf("%d",test1(T(5,4)));//エラー printf("%d",test2(a)); //OK printf("%d",test2(T(4,6)));//OK }
287 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 14:38:16.26 ID:gvx2nAxT.net] >>279 想像のとおりです なのでメンバーが減るようなキャストはまずい
288 名前:デフォルトの名無しさん [2022/02/27(日) 14:51:04.74 ID:ai7feBss.net] >>282 ありがとうございます。 アップキャストダウンキャストも関わっていたのですね すぐにはわかりませんでした。 たとえばなんですけど派生クラスBは基本クラスAに別の名前を付けてかつBで新たに 加えられたメンバはBから紐づけられていて、これらをセットにして見やすくしたものが 派生クラスBになると言う感じなのです?
289 名前:はちみつ餃子 mailto:sage [2022/02/27(日) 15:01:31.40 ID:ftSqTRxL.net] 派生クラスのオブジェクトには基底クラスのオブジェクトが含まれる。 派生クラスの一部であるようなオブジェクト (基底やデータメンバ) をサブオブジェクトという。
290 名前:デフォルトの名無しさん [2022/02/27(日) 16:18:03.61 ID:ai7feBss.net] >>284 ありがとうございます。 サブオブジェクトがサブオブジェクトと言われることにつながるのですね。
291 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 16:44:15.33 ID:+yReYAPt.net] ダウンキャストは危険で、本来無条件にやっていいものではない なので実行時型チェックをして使っている今回は問題ないだけ なお、static_cast<ClassB*>(obj)->VirFunc()は最近のコンパイラ(gcc11.2)だと 最適化なし時はClassA*として仮想関数呼び出しと同じ方法で呼び出す 最適化あり時はvtableがClassB::VirtFunc()かどうか確認してインライン展開したものが実行される (万一確認失敗したら仮想関数呼び出しと同じ方法で呼び出す)
292 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 17:38:03.37 ID:HuUTW9GQ.net] ダウンキャストをするならstatic_castではなくdynamic_castを使うべき。 見ているobjの実体がclassBじゃないなら失敗してnullptrを返してくれる。 そもそもダウンキャストが必要になること自体良い設計ではないが auto* pb=dynamic_cast<classB*>(pobj); if(pb){ pb->...; }
293 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 17:46:47.65 ID:NpJPdMJB.net] 「キャストはなるべくするな、特にdynamicはコストが高い」と古文書にもあった
294 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 17:54:22.89 ID:+yReYAPt.net] 今回はそれをtypeidでやりたかったんでしょ
295 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 18:02:07.86 ID:HfpUvsK0.net] ダイナミックダイクマ
296 名前:デフォルトの名無しさん [2022/02/27(日) 20:42:58.79 ID:ai7feBss.net] なんかC++が気になるので実践的な情報でもなんでもありがたいです。 C++で食べてる人と話したこともないし・・・
297 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 20:45:27.70 ID:NpJPdMJB.net] 古文書には「#defineではなくconst,enum,inlineを使うといい」ってあるよ
298 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 20:47:31.05 ID:nGlHhzSe.net] 死海文書では「constexpr, enum struct, enum class」を使うことで難を逃れたと書いてある
299 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 20:56:43.39 ID:o7kRBzLD.net] const使えば分かる。#defineのほうがやっぱり便利だわ。
300 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 21:21:58.39 ID:Xl3wWN+O.net] C++のenumは機能が弱いからなあ Rustのenumみたいに任意の型の変数値を格納できるようにしてほしい
301 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 21:31:32.92 ID:nXG/aSfD.net] >>275 >>276 その方針で全ての変数のデフォルトをC++のconst状態にしてしまったのがRustだね 代わりに値が変化する変数にだけミュータブル指定しないといけないけど if-elseもループもブロックも値を返してくれるためほとんどの変数が変化しない
302 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 21:36:52.29 ID:o7kRBzLD.net] char*やシンプルな構造体ならconst使うのはメリットあると思うが、 あれこれ機能が詰め込まれるクラスになると不便さ、面倒さのほうが際立つ。 多重継承並にハゲる原因になる。
303 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 22:28:50.95 ID:hjaMvOv0.net] まーたしかにconst_castだらけになるかもしれないね
304 名前:はちみつ餃子 mailto:sage [2022/02/27(日) 23:37:06.31 ID:ftSqTRxL.net] const_cast を正しく使うのは難しい。 const なオブジェクトから const を剥がして書き換えるのは未定義。 数年前に LLVM が const 指定の情報を最適化に活用する方向に舵を切ったというニュースもあった。 const ではないオブジェクトに対して const なポインタや参照を経由している場合には const を外して書き換えるのは許されるはずだが、 それが必要になるようだと設計を見直したほうがいい。 現在のコンパイラは賢くて、 const 指定をしてなくても書き換えられる可能性がないことを見抜いて最適化することも多いんで、 const の指定自体は最適化にはそれほど寄与しないよ。 ただ、 const を前提とした設計はコンパイラにとって最適化しやすい構造である可能性はある。 @ const を前提にした設計にできるもんならしたほうがいい A そうできないなら無理に const を付けないほうがいい (後で場当たり的に const_cast で const をはがすとどこかで間違う)
305 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 23:43:44.46 ID:o7kRBzLD.net] 書き換えないコードの場合はどういう最適化がされるのかを知りたいのだが。
306 名前:デフォルトの名無しさん mailto:sage [2022/02/27(日) 23:51:40.12 ID:HuUTW9GQ.net] getterにlockを仕込む場合にgetterをconstにするべきかどうか悩む const扱いにしてmutexに関してだけconstをはがすべきなのか class C{ std::mutex _mtx; int _a; public: int get_a(){ std::lock_guard lk(_mtx); return _a; } void set_a(int a); };
307 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 00:43:20.93 ID:7GK6w4Z4.net] >>301 俺ならgetterにはconst付けてmutexメンバ変数にはmutable付けるね。
308 名前:はちみつ餃子 mailto:sage [2022/02/28(月) 00:54:54.67 ID:R6BwoFXD.net] >>301 俺も >>302 には賛成。 mutex はあくまでも内部的な実装の都合であって、 それを mutable にしてもクラスの logical constness は維持されると判断する。
309 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:18:45.25 ID:EeqSDih1.net] >>300 だからお前は何を調べたとずっと聞いてるんだがw
310 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:22:01.28 ID:LWo9z6at.net] 言い出した本人が逃げ出して答えないし、誰もはっきりと答えないんだからウソなんじゃね?
311 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:25:22.84 ID:EeqSDih1.net] 状況に依るけどmutableにするなら俺はunique_ptrとかにするかもしれない
312 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:42:21.31 ID:EeqSDih1.net] >>305 言い出した本人はいるし、「お前は何を調べたとずっと聞いてる」のにしかも何度も聞いてるのに答えない=お前が逃げ続けてるからだろ?w
313 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:47:08.01 ID:LWo9z6at.net] 本人いたのか。自分で言い出したはいいが実はさっぱり分からないって感じか。 それはそれで仕方ない。発狂してたら余計にやっぱりウソなんだ〜ってなるだけだぞ。
314 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:50:37.25 ID:EeqSDih1.net] もう寝るけど、お前がただただ煽りながら発狂しちゃってる間も、毎日何某か書いてるんだがw いつになったらお前がどこまで何を調べたのか詳細に説明してくれるのか心待ちにしてるよw
315 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:50:44.99 ID:h02lB8BP.net] >>302 >>303 ありがとうございます なるほどフィールド側でconst扱いしないモードを初めから指定すればいいのか...
316 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:54:51.97 ID:LWo9z6at.net] >>309 やっぱりウソなのか。散々暴れといてしょうもない奴だな、おまえ。
317 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 01:56:18.18 ID:h02lB8BP.net] void f(const std::vector<int>&v){ for(size_t i=0; i!=v.size(); ++i)... } とかで 本来v.size()を毎回呼ばなきゃいけないけどconstだから1回呼ぶだけで十分って話とかじゃないの? まあ俺も-O2コンパイル結果を読む気力はないからエアプ扱いしてもらって構わんが
318 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 02:03:13.46 ID:/gADsoXI.net] constなんていつでもconst_castで引っぺがせるんだから、勝手に定数畳み込みとかは出来ないし じゃあそういうのが無いのを検知すれば出来るだろというと、そんなに賢いならconst無しの変数でも同じ事が出来るはず 結論から言うとconstは最適化に何の影響も及ぼさない 畳み込ませたい定数はconstじゃなくenumか#defineで定義するのが正解
319 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 02:14:26.59 ID:EeqSDih1.net] 複数IDで暴れとるwwwww 朝までに具体的な事例を書いてねw 環境も明記されてないコンパイルも通ってないモノでは想像で言ってるだけってことになるよw
320 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 06:31:25.23 ID:Zh+6zBsp.net] >>312 この例は毎回v.size()呼んで遅くなりうる それは最初に1回一時変数に受ければ解決するがそれがconstかどうかはまずパフォーマンスに影響しないだろう もっというとこれは生のfor文の欠陥でこれからはstd::views::iotaを使っていくべき理由の1つだと思う
321 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 06:47:54.89 ID:EeqSDih1.net] >>315 その例はconstにしようがしなかろうがインライン展開されるので最適化結果に違いはないよ そもそも最適化しやすくなると言ってるだけで、違いがあるとまでは言ってなかったんだけどw >>314 に書いたとおり、煽るだけ君は結局「想像で言ってるだけ」なんだなw 妄想はほどほどにしてくれw 最適化コードに違いがある例が以下。マクロの定義を空にすればconstなしのコードになる。 https://godbolt.org/z/YavYzrE3z #define CONST const template<typename T> struct s { T value; operator T() CONST {return value;} }; CONST s<int> a[] = {1,2,3,4,5}; template<typename T> T func() { T r = 1; for (int i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { r *= a[i]; } return r; } int main() { return func<double>(); }
322 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 07:29:26.73 ID:Zh+6zBsp.net] >>316 俺はこの話題に関して初めて書き込んだ者だが
323 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 07:34:24.42 ID:Od0J2fCm.net] >>316 都合の良い例にしすぎだろ
324 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 07:43:08.18 ID:EeqSDih1.net] 反証は1つで十分w 具体例の1つも書けない人は黙ってようねw
325 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 08:14:09.88 ID:Od0J2fCm.net] ああすまん、変化しない例を出してるつもりだと思ってた そんなコードでも変化したりするのね
326 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 10:21:52.93 ID:ftLJb++c.net] 古文書には#defineは良くないってあったけど今のC++ってその辺り改善されたんですか?
327 名前:はちみつ餃子 mailto:sage [2022/02/28(月) 10:47:09.12 ID:R6BwoFXD.net] >>321 ある程度は。
328 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 10:56:01.32 ID:xzjNndYE.net] >>321 「その辺り」って何? スコープとの相性が最悪って意味なら変わってないぞ
329 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 11:04:38.67 ID:ftLJb++c.net] >>323 他所からパクってきたコードですが、#defineはそのまま書き換えるだけだから以下や #define SIX 1 + 5 #define NINE 8 + 1 int main(void) { printf( "What you get if you multiply six by nine: %d\n", SIX * NINE ); return 0; } 以下の関数の呼び出しなどで意図しない挙動になったりとかです #define SquareMulti(x, y) x * x * y SquareMulti(++a, b)
330 名前:はちみつ餃子 mailto:sage [2022/02/28(月) 11:14:22.32 ID:R6BwoFXD.net] >>324 その程度なら inline や constexpr を活用するのが今は良い作法
331 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 11:19:01.97 ID:xzjNndYE.net] >>324 マクロに関してはそういう所は変わってない 餃子が言うようにマクロ以外の手段を使うというだけ
332 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 11:20:49.97 ID:+7QZaSxQ.net] >>321 #defineじゃないとできない/面倒なパターンが減ったという意味ならある程度はマシになってる <numeric>とか<source_location>とかconstexpr/constevalとか