C++相談室 part164

■ このスレッドは過去ログ倉庫に格納されています
2023/05/09(火) 11:50:52.06ID:EYc2I7oW0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part163
https://mevius.5ch.net/test/read.cgi/tech/1672409791/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/07/18(火) 00:38:24.79ID:ibbV/iYr0
皆さんありがとう。
>>506
ブロックスコープは知りつつも、ループのブロックの場合はループ中は寿命が継続すると思っていました。
ループ時に毎度後始末されるなら安心です。
2023/07/18(火) 01:05:37.37ID://OyAtPF0
>>511
根拠。
https://timsong-cpp.github.io/cppwp/n3337/basic.stc.auto
2023/07/18(火) 02:17:55.25ID:BpIlHiPB0
組み込み用途のライブラリで毎回ループ終端でデストラクタが呼ばれるように普通は設計しないから大丈夫
疑わしいならベンダーに問い合わせるかライブラリのソースを読めば解決
2023/07/21(金) 16:52:12.91ID:PleiVI860
ちょいとコイツを見て欲しい。MSVC 14.36.32532でC++17かつセキュリティチェック無効(/GS-)

https://i.imgur.com/XGfeBgH.png

最小コードで再現するために、コマンドライン文字列を変な形式として扱ってるのは置いといて
変数rSizeが、引数argcのスタック領域(ebp+8)に割り当てられるんだけど、こんな最適化ある?
確かにargcは用済みだが、レジスタやローカルスタックではなくcdeclのconst引数にストアする?
2023/07/21(金) 16:56:19.42ID:LKM5BaGE0
そんなことよりbooost向けの技術書について教えてくれ
2023/07/21(金) 18:04:39.14ID:GfD0zzOHd
そんな最適化あるよ。長期に渡って解析やってたらときどき出くわすよ。
2023/07/21(金) 18:26:11.73ID:eD9pKuA20
ADLについて初めて知ったのがboost::mathだった懐かしい
2023/07/21(金) 20:33:22.11ID:9+qEAU5C0
観測可能な範囲で規格通りの挙動をする限りは、コンパイラ様はどんなバイナリを吐こうとどんな風にメモリやレジスタを扱おうと自由なのだ
2023/07/22(土) 11:54:04.91ID:1sMnnOgP0
if文の条件式のところにがっつり文が書かれてゐる
最後の式の値が結果、とかますますPerl的世界に……
そのうち値を返す関数もreturn書かなくて良くなったりして……
2023/07/22(土) 12:15:40.55ID:QLIAp4G50
>>519
任意の文を書けるわけではなく単純宣言に限られる。
2023/07/22(土) 13:25:58.60ID:uVFJqD+w0
うん。なんか「見てくれ」とか言うから見たけどサンプルとしてもしょーもないコードだなと思って
一度コメントしかけてやめた
windowsのxx仕様 独自mainとか
2023/07/22(土) 13:27:45.64ID:uVFJqD+w0
自分が本当に答えを知りたいんじゃなくて、フレームというか、言い争いを起こして面白がりたいのかな、とか
2023/07/22(土) 15:21:09.39ID:1sMnnOgP0
やっぱ
void foo() {
 for (int i = 0; i < 100; i++) { .... }
 for (int ii = 0; ii < 100; ii++) { ... }
 ...
 for (int iiiiiiiiiiiiiiiiiiii = 0; iiiiiiiiiiiiiiiiiiii < 100; iiiiiiiiiiiiiiiiiiii++) { ... }
}
とかあってどのfor文でもループ変数のアドレスをとるような式が書かれていなかったら
ローカル変数i、ii、...、iiiiiiiiiiiiiiiiiiが違うアドレスでなければならない理由は何も無いから
同じアドレスに割り当てになる可能性は高いと思う
でデータフロー解析するステップではもはやブロックの構造とか渡ってないから
そういう芸当をする同じロジックが>>514のようなことも当然するキモス
※ 個人の感想です
2023/07/22(土) 15:31:39.00ID:1sMnnOgP0
ていうか補足、
void bar(int& x);
というのがあって
for (int i = 0; i < 100; i++) { bar(i); }
for (int ii = 0; ii < 100; ii++) { bar(ii); }
for (int iiiiiiiiiiiiiiiiiiii = 0; iiiiiiiiiiiiiiiiiiii < 100; ii++) { bar(iiiiiiiiiiiiiiiiiiii); }
だった場合はこれは明示的にループ変数のアドレスをとっているわけではないが、
アドレスをとっているのと同じことなので
i、ii、...、iiiiiiiiiiiiiiiiii同じアドレスに割り当てになる可能性は無くなると思う
よかったなあ>>514
2023/07/22(土) 15:33:20.61ID:1sMnnOgP0
しかしわからんのは
void bar(const int& x); // const !
だった場合は
for (int i = 0; i < 100; i++) { bar(i); }
for (int ii = 0; ii < 100; ii++) { bar(ii); }
for (int iiiiiiiiiiiiiiiiiiii = 0; iiiiiiiiiiiiiiiiiiii < 100; ii++) { bar(iiiiiiiiiiiiiiiiiiii); }
だった場合はi、ii、...、iiiiiiiiiiiiiiiiiiが同じアドレスに割り当てられ得るのかどうかわわからん……
2023/07/22(土) 15:41:23.03ID:1sMnnOgP0
ゴメ自己解決しますたorz
2023/07/22(土) 17:02:04.17ID:lBkog51W0
スコープを抜けたローカル変数であれば順当な割り当てに思えるのだけど
>>514が差し支えるのはコードインジェクションで引数を使い回すとかの横着
さりとてトップレベルのconstやvolatileは関数シグネチャに現れない訳で
cdeclであろうと引数の寿命は関数を抜けるまでだろうから極めて妥当なのか?

14.27.29110ではやらず、スタック量は逆に増え…増えたから節約してるのか
rbp+なら…いやそれも引数用スタック。C++20でvolatile非推奨化は有ったが
volatile引数への代入も引数スタックへの書き込みと思っちゃならんのかな
2023/07/22(土) 18:07:10.54ID:QLIAp4G50
>>527
言いたいことがあるなら独り言を書くんじゃなくて説明しろ。
2023/07/22(土) 18:59:44.13ID:h3Z+iL0O0
>>528
どの部分ですか?rbp+のくだりならx64であればシャドウストアを呼び出し元が確保する事になっているので
引数へ代入以外でもrbp+に書き込まれるが、それにしたって引数の退避以外で行われるかという意味だけど

またこの最適化が適正だとすれば引数へconstを指定しても
それは引数の格納元が書き換わらない事を意味しない訳で
volatileにしても引数スタックと同一視は出来ないのかなと
2023/07/22(土) 19:01:30.20ID:gun3EJ7PM
>>519
resultは欲しいね。
2023/07/22(土) 19:08:50.81ID:nQhdUCcc0
とりあえずcallee-savedとcaller-savedあたりでググってこい
2023/07/22(土) 19:21:42.17ID:QLIAp4G50
>>529
技術的な意味合いじゃなくてね、
それをのべてどうしたいのってことだよ。
疑問なのか?主張なのか?感想なのか?
2023/07/22(土) 23:38:20.21ID:a8PwsTyx0
これだけは言っておく
文章が下手糞はプログラミングも下手糞ってことだ
2023/07/22(土) 23:53:10.56ID:31w2/Kbx0
久々にヤバい変数名を見た
>>525
このクソみたいな変数名はおまえが考えたのか
2023/07/23(日) 01:23:57.19ID:3Ckw8KVE0
>>533
母語で説明できないようならプログラマには向いてないとかいう意味のことをダイクストラが言ってたな。

普通の人は母語が最も得意なはずだからそれで表現できないのに
プログラミング言語でなら表現できるってことはないのは道理というものだ。
2023/07/23(日) 07:00:15.87ID:TPcdF2Bwd
二、三個違えて大域変数切って火に油注ぎたくなるやつ
2023/07/24(月) 22:04:55.27ID:7/Qlh6bu0
さんざん言われてるけど質問文きちんと書ける人はChatGPTで自己完結しちゃうんだよな
2023/07/25(火) 00:09:45.61ID:ngER/Udx0
ゴメス>>524はリリースビルドしたら全部同じアドレスになったわ;;;
やっぱ握った変数なりオブジェクトなりのアドレスを
その変数なりオブジェクトなりの寿命が尽きた後に
使おうとするのは未定義動作であることだなあ、
2023/07/25(火) 03:57:53.89ID:YH2RVZct0
俺には>>524がなんでそんな結論になるのか分からんのだが
for内で i を宣言してるんだからfor のスコープを持つローカル変数だろ?
int が4バイトの前提で言えば for 突入時に int i をスタック上に確保(スタックポインタを4バイトマイナス)して for 離脱時に int i の領域を解放(スタックポインタを4バイトプラス)する
この繰り返しなんだから int i や int ii のアドレスが同じになることに疑問を挟む余地がないと思うんだけど
何がおかしいのか俺にはさっぱり分からん
2023/07/25(火) 09:19:21.66ID:k8WJtY+Ua
for の i がローカルになったのは最近
グローバルに盛れるコンパイラ環境は巷に溢れていた
541デフォルトの名無しさん (アウアウウー Sa2b-tGd7)
垢版 |
2023/07/25(火) 09:19:57.50ID:k8WJtY+Ua
盛れるじゃなかった
漏れる
2023/07/25(火) 11:10:04.37ID:akUn9hsS0
>>540
最近っていつ頃のことだ?
2023/07/25(火) 11:32:44.39ID:YIf2r9Dz0
#define for if(0) else for
2023/07/25(火) 11:34:38.41ID:YIf2r9Dz0
間違えた
#define for if(0) {} else for
これでゾンビiよく消してた
2023/07/25(火) 12:01:03.86ID:RkQ0FrMx0
>>544
ごめん、まじめに教えて
これ何の意図?

これに意味がある具体的なコンパイラって何の何version?
2023/07/25(火) 12:08:13.03ID:YIf2r9Dz0
VC++6.0という大昔にデファクトスタンダードだったコンパイラだ
2023/07/25(火) 12:10:00.81ID:RkQ0FrMx0
>>546
ほんとにごめん、何の意味があるの?
2023/07/25(火) 12:12:51.37ID:YIf2r9Dz0
例外飛ばすと自動変数の破棄全部ふっ飛ばして戻ってくる酷いポンコツだったな
よくこんなの皆つかってたなというかコレしかなかったからな
2023/07/25(火) 12:13:49.52ID:akUn9hsS0
>>545
for の初期化節で変数宣言した場合にその外側のブロックがスコープになるコンパイラが存在し、
その対抗策としてこういうマクロを導入するという方法があったという話だろ。
2023/07/25(火) 12:14:32.19ID:YIf2r9Dz0
>>547
意味がわからないなら知らなくていい
当時を知らないなら理解しようとするだけ無駄というもの
2023/07/25(火) 12:24:31.68ID:RkQ0FrMx0
>>549
ありがとう、そしてありがとう

>>548
VC6がポンコツは同意。
あのころMSはディンカムウェアからstd c,c++ ライブラリを買って導入してたけど、そもそもc++の仕様準拠がメチャクチャだったと認識してます
もうVC使わなくなって長いので気にしなくなった
2023/07/25(火) 12:39:41.95ID:RkQ0FrMx0
『for内スコープ』の仕様にvc6は未対応だ、という事実を認識し
責任者がvc6を選択した案件で納品する

なら、その条件に従って書く(つまらないつまづきに繋がる書き方を避ける)のが他者に対して親切な技術者だと思うが

「そういう話はマ板で」か
2023/07/25(火) 12:56:14.20ID:akUn9hsS0
>>551
言語仕様が改訂されたんだよ。
C++98 が成立するちょっと前まで for 文の外側のブロックをスコープとするルールで正しかった。
ARM (The Annotated C++ Reference Manual) でも旧ルールで説明されている。

VC の出来が悪かったのは事実だと思うが
スコープルールに関しては互換性を是とするウィンドウズの価値観に合わせて
意図的に変更を遅らせたのだと思う。
2023/07/25(火) 14:00:38.34ID:uSv6E5akF
いと懐かしき
2023/07/25(火) 14:23:07.06ID:kV+p+cpE0
Visual C++ 6.0がリリースされたのが1998年じゃん
25年前じゃん。全然最近じゃないじゃん
遠い過去のことをつい最近って話すのはやめてほしいね
2023/07/25(火) 14:31:50.00ID:MikqYz6X0
>>555
だまれ小僧! 最近じゃよ
2023/07/25(火) 14:44:27.15ID:vokyohz+0
20年くらいまえのソースコードだったら
読む機会がないわけでもないからなぁ。
最近と言えるかどうかはともかくとして
経緯を知っておくに越したことはない
2023/07/25(火) 14:44:43.95ID:iTChcdyRa
25年前に30代だった人の多いスレ
2023/07/25(火) 14:54:13.97ID:218oSqZIM
現役世代なら25年前なら20代
2023/07/25(火) 14:55:29.80ID:MikqYz6X0
だまれ小僧ども!
2023/07/25(火) 16:16:06.83ID:uXZxGhnB0
おじいちゃんかな入力使ってそう
2023/07/25(火) 16:50:53.20ID:akUn9hsS0
リアルで トントカイモ をやったことある世代だわ……
2023/07/25(火) 20:33:32.87ID:RkQ0FrMx0
>>560
そこは
黙れ小僧、お前にSUNが救えるか!
じゃないの?

sunのccって何だっけ

でも個人的にはc++ユーザなら2014年以降の話をして欲しい
2023/07/25(火) 21:15:39.67ID:2EbZvvbp0
(昔話うぜー)
2023/07/25(火) 21:54:33.88ID:akUn9hsS0
>>563
古い規格に基づいたコードが消滅しているならそれでもいいけどさ。
2023/07/25(火) 22:52:02.65ID:ngER/Udx0
>>539
アドレスをとったらメモリエリアシング除けで最適化が抑止される
そう思っていた時期が僕にもありました先週
2023/07/25(火) 23:10:43.20ID:akUn9hsS0
アドレスとエイリアスは別枠なんだわ。
ポインタを数値として表示させると同じなのに == で比較すると偽値 (エイリアスではない) ということがあり得る。
pointer provenance の概念について調べてみると面白いかもね。
2023/07/26(水) 07:52:30.48ID:Ymbp6+unM
古いコードに執着しはじめるならもういい加減引退した方がいい
2023/07/26(水) 13:05:53.40ID:Z/zSkMd/0
>>568
誰かが書き換えなきゃ新しくはならんのだぞ。
2023/07/26(水) 14:04:23.46ID:nSMXTC2xM
まったく無いとは言わないが20年以上も昔のコードを弄る機会って実際どれくらいあるのか
あまりに不毛な主張だろう
2023/07/26(水) 14:22:14.82ID:x/JHBN7Z0
>>129
これが実現出来ればそういう心配事も無くなるんだがな
2023/07/26(水) 14:24:26.98ID:Z/zSkMd/0
ちなみに俺は少なくとも C++11 以降だろ (C++20 は時期尚早かもしれない) 派だし
趣味でプログラミングしているから実務現場はわからない。
でも確実に 20 年前くらいのコードは生きてるよ。
質問サイトで (古いコードの意味について尋ねる質問に対して) 歴史的な事情を説明したことは何度もあるから。
それが割合としてどんくらいかというと確かに少なくはあると思うが……。
2023/07/26(水) 17:59:22.96ID:EGwoK+U90
11は妥当かも。新しいauto は11から一部、で14で増えた訳よね
C++の仕事で、例えばauto使ったらダメって言われたら、工エエェェ(´д`)ェェエエ工 アンタ達何でCじゃなくてC++使ってるん?てならんか

(マ板的な話でごめんね)
仕事で、Cで未だに99がダメとかいう頭おかしい現場もあり、問い詰めると周辺ツール整備の予算の都合と言い訳される。そういうのを切る政治のために喫煙所活動したり、元社の海外部署の圧を使ったりする

まあでも、自衛隊の武器でもC++あったよ…ただ、武器にはちゃんと使用期限があって。5年とか。継続で使いたい場合には再整備事業が起きる。次の期限いっぱいまで修理可能であるように求められるのね

新規は14以上、保守は11以上、は妥当かもね
2023/07/26(水) 20:17:04.26ID:zBy57xkKM
動的に重たい機能(例外とか)を取り除いたembeded c++に再チャレンジしてほしいわ。

c with structure and template くらいの。
2023/07/26(水) 20:27:29.80ID:qeWM+gpE0
また禿に死ぬべきだって言われるだけだぞ
2023/07/26(水) 20:36:31.16ID:J6WrB9lP0
俺も趣味でしか使ってないけど、OSSのメンテやってる外人がCで書かれたコードのこと
クソの山と呼んでるのを見かけてみんなそう思ってると信じちゃった
2023/07/26(水) 20:45:03.48ID:T1zuvG990
「クソの山」って英語で何ていうの?
578デフォルトの名無しさん (ワッチョイ dff0-4APs)
垢版 |
2023/07/26(水) 20:47:33.68ID:e36yYIxR0
>>577
stacked shit
ソースはフルメタル・ジャケット
2023/07/26(水) 21:11:20.60ID:T1zuvG990
My intestine is a kind of FIFO.
580デフォルトの名無しさん (ワッチョイ 0720-rRCM)
垢版 |
2023/07/26(水) 21:14:18.52ID:4fMh7lxL0
bullshit
2023/07/26(水) 21:21:43.95ID:Z/zSkMd/0
>>576
現実がクソなんだよ。
それでもコードにしなきゃならないところ(低レイヤとか速度がいるところとか言語を跨ぐインターフェイスとか)でCが使われるから必然的にクソになる。
他の言語で書いたところでたぶんクソだぞ。
2023/07/26(水) 22:07:29.96ID:iOxX8HKcM
自分としては古いC++のコードの方がクソの山に見える
Cはまだまし
583デフォルトの名無しさん (ワッチョイ 6701-I2OL)
垢版 |
2023/07/26(水) 22:16:26.68ID:jPIzcFjy0
5chからの新しいお知らせは、他の板には出ないんだな
2023/07/27(木) 04:04:24.35ID:QeVlkja60
古い事自体は悪い訳ではないよね
質が低いけど影響範囲が大きくて修正されずに生き延びてる糞コードが悪いだけで
2023/07/27(木) 09:00:04.57ID:zEDi2bcm0
>>578
stackだけだと積むというだけで高さはわからないような
they stacked shit that highというのが原文
2023/07/27(木) 09:00:15.65ID:GoQM94Wca
>>582
ほんそれ
+1
2023/07/27(木) 09:39:10.27ID:4LOg1fU50
>>576
PythonとかJavaScriptだけの世界に生きてる人たちはC++はクソとか言ってそうな気がする
2023/07/27(木) 09:49:28.34ID:GoQM94Wca
実際C++は糞だと思う
Cの方がマシ
2023/07/27(木) 10:16:37.98ID:+SEMblDr0
VCでビルドしたC++ライブラリって
mingwでビルドしたオブジェクトファイルとリンクできないよね?
Cライブラリだとできるけども
2023/07/27(木) 10:25:00.16ID:uqLQvp0Q0
c++だとマングリングの規則がコンパイラごとに違うから無理なはず
2023/07/27(木) 10:37:09.86ID:+SEMblDr0
>>590
ありがとうございます
2023/07/27(木) 11:15:58.50ID:p+3LvAw40
COM の規約で運用するという方法もあるけど割とめんどい
2023/07/27(木) 12:11:09.64ID:+SEMblDr0
C++ライブラリとCライブラリの両方があったので
素直にCライブラリの方を使うことにします
594デフォルトの名無しさん (アウアウウー Sa2b-4APs)
垢版 |
2023/07/27(木) 14:18:54.70ID:SGfMLUd3a
>>585
その原文の訳が「まるでそびえ立つクソだ!」だからhighly stacked shitあたりだろうけど、あれはハートマン軍曹という異常者の語彙だから、多分pile of shitなんかの方が一般的かもね
2023/07/27(木) 21:44:21.80ID:alYzqiaL0
msvcからmingwに移行しようと思い、7zを展開したらディフェンダーちゃんが反応したので何かと思ったら
2023/07/27(木) 22:58:54.41ID:p+3LvAw40
実行ファイルを生成するものは割りとひっかかる
2023/07/28(金) 10:55:13.63ID:Zgvcm9f5a
7zを展開する前にファイルをExoplorerから右クリックで開いて
ディフェンダー無効にしてから展開するだけだろ
2023/07/28(金) 13:11:52.02ID:6yxKL9JFd
Defenderに無害認定されるまで戦い続けるマ?
2023/07/28(金) 13:58:16.94ID:AMhr/ZcZ0
どういう設定でコンパイルしたら有害認定されるかむしろ知りたいわ
2023/07/28(金) 20:53:22.55ID:nOGNEf1T0
oss物は使ってくれるなというms様のお達し?
2023/07/28(金) 21:03:20.13ID:iCEYdRhP0
wslでLinux飲み込んだのに?
2023/07/28(金) 21:12:30.62ID:yKS6EUDz0
そういや従量課金回線むけに通信量を制限するソフトを入れたら
通信を阻害するマルウェアとして検出されたことがある。
解釈によってはそりゃそうだと思うし、
セキュリティツールは疑陽性が増えてでも偽陰性を
減らす方向に調整するのはしょうがないんじゃねーの
603デフォルトの名無しさん (ワッチョイ 8f9c-JfPF)
垢版 |
2023/07/29(土) 01:25:10.10ID:eLz5SM1d0
マイクロソフトとしてはストアアプリとして配信して欲しいんだろうね
ZIPなどの野良アプリ配布は不遇の時代よ
2023/07/29(土) 01:41:06.31ID:mO2Fj1W+0
テレメスパイウェアage
2023/07/30(日) 09:49:16.34ID:azQXcNDBa
>>599
コンパイル後のexeがなぜか毎回消える問題は何かのバージョンで過去にあった
2023/07/30(日) 11:40:03.78ID:/52qmc2G0
>>605
恥ずかしがり屋め//
2023/07/30(日) 19:58:32.07ID:cURCmIiS0
Defender様はOS内蔵のC#で作ったexeも容赦なく消してくるぞ
名前が他と被ってたり変な場所に置いたりしてると割と起こる
2023/07/30(日) 23:32:06.49ID:Phugis3j0
初期化していないstd::optional <int>をdereferenceすると0として扱われます
boost::optional <int>だとAbortされるのですが
なぜstdではこのようになっているのかどなたかご存知ですか?
$ cat test.cpp
#include <optional>
#include <boost/optional.hpp>
#include <iostream>
using namespace std;
int main () {
std::optional <int> i0;
cout << *i0 << '\n';
if (i0) cout << "Initilized\n";
else cout << "Not initilized\n";
boost::optional <int> i1;
cout << *i1 << '\n';
return 0;
}

$ ./test
0
Not initilized
test: /usr/include/boost/optional/optional.hpp:1212: boost::optional<T>::reference_type boost::optional<T>::get() [with T = int; reference_type = int&]: Assertion `this->is_initialized()' failed.
Aborted (core dumped)
2023/07/30(日) 23:50:56.20ID:1/o7VgXA0
>>608
どちらも事前条件違反での未定義動作の結果。
「0として扱う」と定められているわけじゃない。
boost が assert で止めてくれているのは親切。
2023/07/30(日) 23:58:13.09ID:Phugis3j0
boostの方が親切ですよね
何でstdでなくしたんでしょ?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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