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/08(土) 11:40:41.01ID:hU6KuhT00
コンテナ使えばVLAって最早必要ないような...
2023/07/08(土) 12:00:36.50ID:p+sO9/0DM
数年前にc++でありながらvectorすらない実装はあったけど
2023/07/08(土) 13:06:37.75ID:E0cUKLNxd
>>440
禿同
443デフォルトの名無しさん (ササクッテロラ Sp0b-/+4S)
垢版 |
2023/07/08(土) 15:36:54.89ID:lxagCGE0p
CのVLAってスタック使われることもあるんじゃなかったっけか
2023/07/08(土) 15:51:02.79ID:Wmg0D33kM
コンパイラによる
2023/07/08(土) 18:03:19.11ID:svQTfB7/0
どうしても VLA が必要だとしたら
そもそもヒープアロケーションのコードを書いてるときとか、
変則的なアーキテクチャで仕方がないとか、
C++ の言語機能が完全には使えない状況かな。

あるいはヒープアロケーションのコストを許容できないほど速度的に厳しいとか。
2023/07/08(土) 20:31:31.43ID:svQTfB7/0
話をぶった切る上に去年の話でアレなんだがこの件。
https://mevius.5ch.net/test/read.cgi/tech/1653135809/734
なんの気なしにログを見返してて思い出した。
unexec だ。
2023/07/08(土) 20:45:51.68ID:wtJKE3gc0
もうアセンブラかVerilog使えって感じだな
2023/07/08(土) 21:25:24.78ID:lX93SXsZ0
世の中には動的確保のコスト計算できない人が多すぎるんだ
2023/07/08(土) 22:15:45.40ID:gvv7KDv40
>>433
ちゃうちゃう、 new deleteのソースアセンブラに吐かせたの見たらGlobalAlloc GlobalFree使ってるわ
さすがにGMEM_FIXEDだったけど
2023/07/09(日) 04:19:53.74ID:MkrAlSpi0
Windowsのメモリアロケータってクソだよな
2023/07/09(日) 05:38:04.63ID:4tVwl4EYM
せやろか
2023/07/09(日) 05:40:32.30ID:DZU7rHSU0
Win16からの色々を引きずってるってこと?
2023/07/09(日) 05:53:12.10ID:xZgYfcZXM
引きずっているのはLocalAlloc
2023/07/09(日) 07:55:31.77ID:wAJ5czLTM
なんとなくメジャーなものをけなして気持ちがよくなってるんだろ
楽だよなそういうので気持ちよくなれる人は
2023/07/09(日) 09:27:34.88ID:MkrAlSpi0
メジャーだからって完璧に出来ているとは思わない方がいい
2023/07/09(日) 09:33:30.46ID:DZU7rHSU0
反体制派な俺すげーだろって痛すぎる厨二病は昔からいるよね
2023/07/09(日) 09:36:52.25ID:IdmutbDk0
具体的にどういう場面で問題があるのか、可能ならサンプルコードなどを添えて指摘してくれないと、同意しようがないよね
2023/07/09(日) 10:14:00.41ID:+WiQ27SB0
そりゃ様々な用途や優先すべき軸がある中で汎用的にあらゆる用途に高性能であれと言われたら
中庸にするか尖らせて特定用途で使い物にならなくなるかの二択になるよね
2023/07/09(日) 10:40:38.50ID:ihdHNtRI0
EXEで確保したしたメモリーブロックをdllで解放するときに(そんなことをするなというのはさておき
むしろmalloc()だとリンクするCRTのバージョン相違でトラブルになりかねないから
OSがmalloc()的なことまでしてくれるのは良い事な希ガス知らんけど
2023/07/09(日) 10:57:36.03ID:6ZzBc/+b0
C++ なら operator new のオーバーロードなんかも出来るわけだし
コンテナ類もアロケータを差し込むことが出来るわけで
メモリアロケーションに関して過剰なほどのカスタマイズ性がある。

もちろん提供されるアロケータで性能が足りるならそれに越したことは無いが、
足りないときでもなんとかできる可能性があるってのは C++ のいいところだよ。
2023/07/09(日) 11:09:45.90ID:ihdHNtRI0
前なんかstd::vector<T>をdllに渡したら(コピー渡ししたら)クラッシュするトラブルに遭遇して
原因はC++のランタイムのバージョン相違やったorz
2023/07/09(日) 11:44:01.32ID:6ZzBc/+b0
DLL を跨ぐときは生配列が結局は楽かなぁ。
他環境に移植する予定がないなら COM の流儀に従って SAFEARRAY とか。
463デフォルトの名無しさん (ワッチョイ d701-/+4S)
垢版 |
2023/07/09(日) 21:30:46.83ID:Y+7J8yUt0
アロケータを指定するときってのは性能どうこうではなく環境や設計上の理由が主だよ
それよりpolymorphic_allocatorはなんでコンテナのコピー時にget_default_resourceを返すんだマジで
2023/07/09(日) 21:44:31.99ID:r53YpIy/0
10年くらい前だけど6コア(12スレッド) x 双頭のマシンで
Debianのlibcのmallocをjemallocに置き換えたら
かなり速くなって感動したなぁ
いまのglibcのmallocはどうなんだろ?
2023/07/15(土) 10:34:20.34ID:/MZbR2lO0
最近クラス作るのが面倒な時thread_localのstd::vectorよく使うんだけど
何か問題起きたりする?
2023/07/15(土) 11:05:18.52ID:08dxROCJ0
問題を検証するコードを書いて実験してみれよ
一日で組めるだろ
2023/07/15(土) 12:21:20.90ID:lF+Fe8GnM
>>466
それ悪魔の証明
2023/07/15(土) 14:11:00.47ID:bqZq+Kwu0
1日で組んだコードも合わせて技術ブログに記事を書くところまでがセット
2023/07/15(土) 14:24:56.68ID:V/XrAlYW0
よく使う割に問題が起きてないならそれは問題ないのでは
証明終わり
2023/07/15(土) 14:38:32.48ID:e8BGem9r0
>>465
std::vector 型の変数がスレッドローカルとして定義されること自体は問題を引き起こさない。
スレッドローカルな変数はスレッドの生成・解放と同じタイミングで生成・解放される普通の変数。
それで問題が起こるなら単にプログラムのロジックに誤りがあるってだけ。
2023/07/15(土) 15:24:04.02ID:8R7I+TSs0
「クラス作るのが面倒な時」と「thread_localのstd::vector」の関連が見えないな。
2023/07/15(土) 16:45:55.27ID:e8BGem9r0
>>741
std::thread は関数オブジェクトを受け取ることが出来る。
スレッドに固有、かつそのスレッド全体で使うようなデータは
その関数オブジェクトが所有するのが常道のひとつ。
しかしスレッドローカル変数もスレッドの寿命と一致する形でのデータ置き場になる。
そういう意味で代替品であると見做すことができる。

という話だと私は解釈したが、 std::vector がどこから出てきたかはわからん。
473はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9832-2eqx)
垢版 |
2023/07/15(土) 19:51:59.74ID:jZQsWptc0
コードで言うなら
https://wandbox.org/permlink/oZ8EAGChqPtobFuY
みたいにするのは面倒だから
https://wandbox.org/permlink/90mvVtrKUca4Iyic
でいいよね?

みたいな話だと思った。
2023/07/15(土) 20:03:36.74ID:UiYhW/dJM
そもそもの知識がないからpythonみたいにリストにぶち込んで
インデックスですべてやろうとかそんな話かとオモタ

python界はすごいぞ
クラスに変数など作らずすべて辞書にぶち込んで使ってたりする
2023/07/15(土) 20:19:33.71ID:UiYhW/dJM
a = {}
a['taro'] = {"name":"太郎","age":25, "sex":"男"}
a['hanako'] = {"name":"花子","age":18 ,six":"六"}
2023/07/15(土) 20:24:16.88ID:08dxROCJ0
変数がすべてバリアントだからなw
2023/07/15(土) 20:27:48.20ID:UiYhW/dJM
if a['taro']["age"] ==a['hanako']["age"]:

これって全然コード補完効かないから脳が死にかける
2023/07/15(土) 20:32:21.17ID:UiYhW/dJM
name="name"
age="age"
sex="sex"
six="six"

とかしたらいいんか
if a['taro'][age] ==a['hanako'][age]:
嫌すぎる
2023/07/15(土) 20:42:45.70ID:oCSaktaG0
プログラマではない人間もユーザー層として存在するし
Python はそういう人間にもリーチしてしまったから
割合としてワヤなものもできやすいというのは理解できる。
2023/07/15(土) 20:45:00.27ID:UiYhW/dJM
a['taro'] = {"name":"太郎","age":25, "sex":"男"}
だけ見るとjsonなのかとも思える
481デフォルトの名無しさん (JP 0H8a-PPvg)
垢版 |
2023/07/15(土) 21:13:09.66ID:2P0YU21lH
あるクラスにあるクラスのコレクションを抱かさせてるなんて良くあると思うけど
その際に外部からそのコレクションを参照したい場合、どうするのが定石なの?
class Datas
{private:std::vector<Data> _datas;};

publicにするとか、std::vector<Data>::iteratorをpublicにするとか
const Data& operator[](int index)をpublicにするとかいろいろあると思うけど
2023/07/15(土) 21:18:25.83ID:UiYhW/dJM
ファーストクラスコレクションの話?
2023/07/15(土) 21:22:12.84ID:wfhnDtnz0
単数: datum
複数: data
2023/07/15(土) 21:24:39.81ID:UiYhW/dJM
今日本屋で○○データムと言う本があった
DATAの単数形がdatumと言うことにこだわる大人って理系だけなんだろうなと感じたらこれだよ
即出て来た
2023/07/15(土) 21:35:08.39ID:wfhnDtnz0
datumに拘ってるのではなくdatasなんて言葉はない
486デフォルトの名無しさん (JP 0H8a-PPvg)
垢版 |
2023/07/15(土) 21:43:33.89ID:2P0YU21lH
そこか、英単語をぐぐったら解決しました。
ありがとうございました
2023/07/15(土) 21:58:55.40ID:oCSaktaG0
>>481
場合による。

見せる相手が最初から限定的であるような場合はフレンドを宣言すればいい。
コンテナ系クラスとかは内部的にはたぶんノードを表すクラスとか
も使ってると思うけどそういう感じで密接に関連がありつつ
他では使う可能性がないような強い関係性がある場合はフレンドにする。

データを保持するためだけの汎用クラスとして定義するならデータメンバは public にしてもかまわない。
std::pair とかはそうなってる。

もうちょっと疎結合にしたいときなら許したい操作だけをpublic なメンバ関数として公開すると思う。

既存のクラスを使いつつ外部に公開するのはサブセットにしたいという場合なら
プライベート継承した上で公開したいメンバだけ using するという方法も取れる。

#include <iostream>
#include <vector>

struct Data : private std::vector<int> {
using std::vector<int>::vector;
using std::vector<int>::operator[];
using std::vector<int>::begin;
using std::vector<int>::end;
};

int main(void) {
Data foo = {1, 2, 3};
for (int x : foo) {
std::cout << x << std::endl;
}
}
2023/07/15(土) 22:04:51.15ID:wfhnDtnz0
>>481
privateメンバなのだから
できるだけ外部からそのコレクションを参照しないように設計するべきだと思うよ
どうしてもってならiteratorではなくconst_iteratorにするとか
あなたが書いてるようにconst Data&を返すaccessorを実装するとか
2023/07/15(土) 22:07:48.52ID:BdK15TwX0
"HogehogeData"という名前で定義されたプログラム上の存在があったら
その複数形はHogehogeDatasと呼ぶしかない
気持ち悪くてもしょうがないんだよ
2023/07/15(土) 22:15:14.37ID:UiYhW/dJM
ファーストクラスコレクションにしないならその実装は不要だ
基本的に存在意味がない
2023/07/15(土) 22:20:38.51ID:oCSaktaG0
ワイはプログラミング言語 Scheme を使ってるんやが Scheme の仕様には datum という語が出てくる。
シリアライズの単位に関する概念なのでリストひとつも datum と (つまり単数形で) 呼ばれるのが
ちょっとモニョッとする。
492デフォルトの名無しさん (JP 0H8a-PPvg)
垢版 |
2023/07/16(日) 08:28:58.24ID:PzNRrLhAH
どうでもいいことを突っ込んでる人いますけど
Datas=>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Data=>aaaaaaaaaaaaaaaa
と置換してください
493デフォルトの名無しさん (アウアウウー Sa3a-ZX0e)
垢版 |
2023/07/16(日) 09:51:34.88ID:Po24/3Vva
hogehogetoyukainanakamatati
で解決
2023/07/16(日) 16:16:15.89ID:z7qY/utw0
powershellはJSONやxmlをその構造のまま扱えたりオブジェクト(PSCustomObject)にも変換できてpythonなんかより小奇麗に書けますよっと
>>478だとif ($a.tsaro.age -eq $a.hanako.age) { ... という具合
2023/07/16(日) 16:20:50.17ID:z7qY/utw0
powershellはC#とシームレスに連携する手段もあってpowershellで苦手な再帰処理とかをC#コードに逃がしてpowershell機能を使いたい部分はActionやFuncから呼び出す事もできますよっと
2023/07/16(日) 16:21:58.50ID:z7qY/utw0
よく見たらここC++スレだね
俺の事は忘れてください
2023/07/17(月) 18:33:54.32ID:mG7BHGLy0
質問なのですがclass Datasというクラスがあってstd:::vector<Datas> vec((size_t)100); であるときに
vec[k]の場所にn個の場所を空けたい(値は初期化済Datasオブジェクトなら何でも良い)場合どう書くべき?
やっぱ手動でsz = vec.size(); vec.resize(sz + n);して既存要素vec[k..sz-1]を後ろ(vec[k+n..])にコピーする --- (1)
のが最速?

仮にstd::vector<T>::insertを使うと
 Datas x;   // (A)
 vec.insert(std::next(vec.begin(), k), n, x); // (B)
になると思うのですが、なんか(A)で不必要にオブジェクトを1個構築せねばならないのと
(B)で多分デフォルトコンストラクタではなくコピコンがn回呼ばれるのちょっち嫌
(なぜなら(1)のコピーとn個分の場所の確保に加えて、xをn回コピーするという余デフォルト構築よりも遅そうな処理をするから
2023/07/17(月) 20:23:35.30ID:YifLUjyU0
>>497
resize だって再配置 (に付随するコピー) の可能性はあるんで
どっちでも大差ないんじゃないかな。
楽だと思うほうで書けばいいと思うよ。
2023/07/17(月) 21:47:09.31ID:I9Lq0d6Q0
>>497
無駄なデフォルトコンストラクタやコピーを削って極力ムーブで済ませようと思ったら
sz, k, n の大小関係ごとに場合分けして move_iterator 経由の insert とか使い分ければ
いけそうだけど、面倒なわりに見合うほど効率改善しそうな気はしない。
2023/07/17(月) 22:08:16.87ID:kACYNrgv0
書き込みはそこまで遅くないから労力に見合わないだろうね
2023/07/17(月) 22:54:28.45ID:vqJJKRdWd
速度を気にするなら実測しないと始まらないよ。
2023/07/17(月) 23:18:54.88ID:vGotTgNV0
リアルタイムOSのタスクのように無限ループが前提のとき

TASK Task1() {
while(1) {
Obj1 obj = Device::GetObj();
:
:
}
のようにobjを使う場合に、GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。

そうなると自作でないクラスのメソッドは使う前にnewの有無をすべて調べなければならなくなるように思います。
実際はそんな不条理はないはずで、このような問題はどう対処するのがいいですか。
2023/07/17(月) 23:25:49.78ID:CT+u9aWW0
>>502
自作でないクラスのメソッドは使う前には
メソッドが消費するメモリを見積もらなければなりません
不条理でも何でも無い
2023/07/17(月) 23:34:05.22ID:mG7BHGLy0
わかりました
2023/07/17(月) 23:42:05.60ID:kACYNrgv0
自作でないクラスでも使う関数がメモリ動的確保するかどうか普通は確認するぞ
2023/07/17(月) 23:46:35.71ID:mG7BHGLy0
>>502
>GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。
この懸念は普通の作りなら基本的に無用。基本的に問題無い

(1) Obj1という型がポインタやハンドルではなくクラスの場合:
objはwhile(1) { }のブロックの中で構築されるので
ループの終わりでデストラクタが呼ばれる(破棄される)から、
Device::GetObj()が真っ当な作りならnewしたポインタをObj1のインスタンスobjに引き渡し、
Obj1クラスが真っ当な作りならobjが破棄されるときに引き渡されたポインタをdeleteする(ように作る
からダングリングポインタは生じない(ようにできる

(2) Obj1という型がポインタやハンドルの場合
確保したポインタやハンドルはいずれクローズせねばならない。
ループが次の繰り返しに入る前に確実にクローズすればよい
2023/07/17(月) 23:47:03.13ID:mG7BHGLy0
基本的に、というのは(2)のケースで例外が生じたときクローズされずに抜けてしまう危険性があるのと、
(1)のケースにおいてもobj1の構築中に例外が生じた場合はきちんとデストラクトされない危険性がある。
Obj1のメンバがnewされるべき生ポインタの場合はこれは対処不能。生ポはやめてスマポにすればおk

詳しい話ははちみつ餃子氏に聞くと良い(マテ
2023/07/17(月) 23:58:52.90ID:mG7BHGLy0
訂正orz、
誤: ループの終わりでデストラクタが呼ばれる(破棄される)から、(>>506
正: ループが次の繰り返しに入る前かループを抜ける際にデストラクタが呼ばれる(破棄される)から
2023/07/18(火) 00:04:09.43ID:yoLqrsJ/0
>>502
必要ならそのGetObj()とやらのドキュメントにDevice::ReleaseXyz()とかDevice::ReleaseObj(obj1)とかobj1.release()とかを後で呼ぶように指示されてるはず
それを怠ってリークさせたならお前がタコ
そういう指示がないくせに勝手にリークするならそのライブラリがタコ
そんだけの話
2023/07/18(火) 00:16:34.06ID://OyAtPF0
そして使い方がドキュメント化されてないなら組織として問題がある。
が、そういう話はマ板で。
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 がローカルになったのは最近
グローバルに盛れるコンパイラ環境は巷に溢れていた
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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