X



C++相談室 part152

■ このスレッドは過去ログ倉庫に格納されています
0676デフォルトの名無しさん
垢版 |
2020/09/25(金) 17:36:29.46ID:3+LaQyVV
>>675
自動変数かどうかわからんものへのアクセスをSP相対にできるのかって話だよ
重箱の隅ではないごく一般的なケースだぞ

ここC++スレだぜ? this->すげー多用するんだが
UV-EPROMのまま更新が止まった頭じゃ思い至らんかったか
0677デフォルトの名無しさん
垢版 |
2020/09/25(金) 17:48:59.95ID:cdg8K9Zm
>>676
> 自動変数かどうかわからんものへのアクセスをSP相対にできるのかって話だよ
だから自動変数へのポインタを求めるのは呼び出し側でSP相対で計算してるだろ
呼ばれた側は単なるアドレスになってるから関係ない
C/C++の基礎だぞ、まじでわかってないのか?
EP-ROMとか言う前にちょっとは考えろよw
0678デフォルトの名無しさん
垢版 |
2020/09/25(金) 18:47:54.21ID:ZULCp3JG
>>667
> 8bit時代からの組込み屋でテープもEP-ROMも使ってた

このスレ凄い人おるんやな
素直に感心したわ
0680デフォルトの名無しさん
垢版 |
2020/09/25(金) 18:53:47.19ID:cdg8K9Zm
>>678
別に凄くはないよ
そういう時代に仕事してたってだけの話
もうすぐ定年だけど正直仕事としては当時の方が面白かったな
まあ時代が上り坂だったせいもあるけど
0681デフォルトの名無しさん
垢版 |
2020/09/25(金) 18:56:12.18ID:3+LaQyVV
>>677
this->がどう翻訳されているのか覗いてみたことがないから
スタックへのアクセスはほとんどがSP相対だなんて大きく出たんだろ

おまえマジC++でROM焼きしてねえだろ
0682デフォルトの名無しさん
垢版 |
2020/09/25(金) 19:13:00.04ID:cdg8K9Zm
>>681
> this->がどう翻訳されているのか覗いてみたことがないから
C++はスタティックとかヒープとかにインスタンス置けるから一概には言えんけど自動変数としてインスタンスを生成したらthisポインタはSP相対になるだろ
ならない例があるとでも言うのか?

> おまえマジC++でROM焼きしてねえだろ
まあC++のROM焼は確かにあまりないな
ROM焼きするのは8bitはほぼアセンブラだし、16bitでもC言語だったし
ただC言語でもスタック上に生成した構造体へのポインタはC++のthisポインタと同じだしな
アセンブルリスト見たらすぐわかる話
0685デフォルトの名無しさん
垢版 |
2020/09/25(金) 20:41:49.58ID:3+LaQyVV
>>682
C++でROM焼きしてねえんだな?
このスレではゴミだぜ、クズだぜ
そこ弁えろな、ゴミクズ

thisがSPとか寝言ぬかしてんじゃねえ
0686デフォルトの名無しさん
垢版 |
2020/09/25(金) 20:53:09.26ID:uaSa3tOr
スタックに必要なサイズを求めるのはとても面倒だった。
だから、予め決まった領域を割り当てるのは不可能に近かったので、
データ領域とは逆さまに、データ領域が最後まで使わない部分をスタック
領域とし、暴走しない限りはスタックが足りていると判断する(笑)と言う
当時としては合理的な方法が採用された。
この方式だと、スタックサイズが見積もれなくても、問題が無い。
本等はスタックが足りているかどうかは、暴走したかどうかではなく、
機械語モニタなどで、スタック付近をダンプしてみて、00h以外の値が
ある部分がスタックが使用されている領域とみなすことが出来た。
0688デフォルトの名無しさん
垢版 |
2020/09/25(金) 20:57:43.58ID:uaSa3tOr
>>682
もちろん、その関数の中ではsp相対になる。
しかし、C言語では、ローカル変数のアドレスを他の関数に渡す。
一方、グローバル変数のアドレスも同じ方式で他の関数に渡す。
で、どちらからきたアドレス化を区別する方法が基本的には無い。
区別するためには、far pointer といって、普通のアドレス以外にセグメントアドレス
を合わせた長いポインタを渡す必要があった。
しかし、それは何かと効率が悪かった。
そこで、Windowsは32BIT化したときに、far pointerを使わずに済ますため、
(大体で言えば)セグメントを全て共通のベースアドレスとサイズを持つようにし、
「Full Flat」方式を採用した。
これで、ポインタ渡したり記録したりするための領域が短くて済み、
効率が上がった。
0689デフォルトの名無しさん
垢版 |
2020/09/25(金) 20:58:24.32ID:cdg8K9Zm
>>685
で、SP相対にならない例はあるんか?
>>679見る限り汎用機のオペレーターさんみたいだからあまり無理すんなw
0691◆QZaw55cn4c
垢版 |
2020/09/25(金) 21:14:22.02ID:DCkHs+Bt
>>688
sp 相対アドレッシングって 6809 以外にはなにがあるのですか?
0693デフォルトの名無しさん
垢版 |
2020/09/25(金) 21:43:27.60ID:cdg8K9Zm
>>688
申し訳ないけどfarポインタの話は頓珍漢だしややこしくなるだけだよ
セグメントレジスタはSSとDSだけじゃなくてCSやESもあるし、そもそもローカル変数とグローバル変数を区別するためのもんじゃないし

>>690
>>663w
0698デフォルトの名無しさん
垢版 |
2020/09/25(金) 22:17:10.28ID:iQJ3d1Xe
thisの話は何をモメてるかよくわからないが、単順にブート時のSP初期化値の変更で
後ろのスタックをアクセスするコードを修正する必要があるかないかという話。
彼はSP相対(←この表現がおかしい?)だから変更する必要がないと言ってる。
まぁ、基本手はにはそうだが、処理系によってはバンク切り替えでスタックエリアが裏に回る可能性も否定できない。
そして今時のカーネル開発のようにコンテキスト保持のために同期てんこ盛りになるわけだ。
0699デフォルトの名無しさん
垢版 |
2020/09/25(金) 22:22:47.78ID:cdg8K9Zm
>>691
6800とかでもTSX命令でSPをインデックスレジスタにコピーして相対アクセスできる
8080ならSPHLでSPをHLレジスタにコピーできる、オフセットの処理は自前でやるしかないけど
まあ6809や8086に比べたらかなり効率悪いコードになるけどね
0700蟻人間 ◆T6xkBnTXz7B0
垢版 |
2020/09/25(金) 22:23:24.07ID:ogXn8IQh
x86のC言語では、スタックに積み込まれた自動変数のデータは、SPが変更されてもスタックフレームを復元すれば、変更前と変わらずアクセスできる。SPの値もプッシュ・ポップできる訳であって。
0701デフォルトの名無しさん
垢版 |
2020/09/25(金) 22:25:44.11ID:cdg8K9Zm
>>698
> 処理系によってはバンク切り替えでスタックエリアが裏に回る可能性も否定できない。
そんな特殊な例を出されても…
0702デフォルトの名無しさん
垢版 |
2020/09/25(金) 22:33:13.14ID:iQJ3d1Xe
一般的な日本の8bitPCで64KB空間しかないのにROMだけでもあれこれと数百キロバイト積んでるし、
VRAMもでかい。基本、z80も6502もフラットを要求するCとの相性はよくない。
0703デフォルトの名無しさん
垢版 |
2020/09/25(金) 22:48:54.96ID:ZULCp3JG
6800てw
ワイが学生時代演習で使ったのが68000だったなぁ
今となっては何一つ覚えてないけど
0704デフォルトの名無しさん
垢版 |
2020/09/26(土) 01:53:27.55ID:JrFBwqTU
もはやC++全く関係ない話だな
0705デフォルトの名無しさん
垢版 |
2020/09/26(土) 06:33:34.63ID:JvTrRG8q
>>693
おまえさんが使う空疎な罵倒語とは違うぞ
なぜゴミクズなのかきちんと説明したうえで言っているからな
0706デフォルトの名無しさん
垢版 |
2020/09/26(土) 06:40:46.95ID:U+G6yEte
>>705
> スタック領域変わったからと言ってSPの初期値以外に一体何を書き換えるんだよw
の答えはまだかな?

> 許して欲しいならちゃんとそう言えよ
> まあ逃げても追わねえでやるけど
そのまま返してやるからさw
0707デフォルトの名無しさん
垢版 |
2020/09/26(土) 06:47:39.19ID:JvTrRG8q
>>706
答えはまだかなって、そもそも俺は聞かれてないんだが?
レスの流れをもっぺん追ってみな
0710デフォルトの名無しさん
垢版 |
2020/09/26(土) 06:57:40.31ID:U+G6yEte
>>709
馬鹿なの?
お前に対しては聞かないというだけの話
>>653が早く答えればいいだけ
まあ無理だからゴミクズとか言い出してるんろうけどw
0711デフォルトの名無しさん
垢版 |
2020/09/26(土) 07:13:53.77ID:JvTrRG8q
>>710
おまえさんがゴミクズなのはC++でROM焼きしてないからだ
それをすり替えようったってそうはさせねえよ
わかったか? ゴミクズ
0713デフォルトの名無しさん
垢版 |
2020/09/26(土) 07:37:41.03ID:JvTrRG8q
ここはC++スレだ
ゆえにC++でコード書いてないやつは価値ゼロだ

もう一度言う
おまえさんがゴミクズなのはC++でROM焼きしてないからだ
8080であろうが6809であろうが関係ない
C++でコード書いて得た知見を言え
それ以外の戯れ言はいらん
0714デフォルトの名無しさん
垢版 |
2020/09/26(土) 08:42:15.83ID:U+G6yEte
>>713
ROM焼きしてないだけでC++はガンガン使ってるけど?
thisポインタなんてstructへのポインタを自動生成してるだけ
初期のC++処理系でC言語に変換したコードとか見たことないのか?
0717デフォルトの名無しさん
垢版 |
2020/09/26(土) 12:45:09.58ID:uIJkShC0
スタック上にある構造体を指すポインタはスタック領域を指すっていう
それだけの話で100レス以上も盛り上がれるなんて楽しそうで羨ましい
0721デフォルトの名無しさん
垢版 |
2020/09/26(土) 13:18:24.22ID:JvTrRG8q
上から目線で頓珍漢な結論を開陳
上から目線で頓珍漢な結論を開陳
上から目線で頓珍漢な結論を開陳
0722デフォルトの名無しさん
垢版 |
2020/09/26(土) 13:25:59.50ID:JvTrRG8q
>>716
633とかの黒歴史はなかったことにしたいんだろw
C++使ったことない環境の話でドヤるなと牽制されて

なあID:cdg8K9Zmよ
0723デフォルトの名無しさん
垢版 |
2020/09/26(土) 15:07:52.90ID:U+G6yEte
>>722
ん?
633のどこがおかしいの?
結局、
>> 設定値を変えるだけだろとか簡単に言われても困る。
> スタックへのアクセスってよほどトリッキーなことをしない限りSP相対だぞ
> スタック領域変わったからと言ってSPの初期値以外に一体何を書き換えるんだよw
の回答もないんだけど、君が答えてくれるのかな?w
0724デフォルトの名無しさん
垢版 |
2020/09/26(土) 15:21:46.24ID:RuVJsWZT
当初は技術論をぶつけあってるようで興味深く読ませてもらってた
難しくて理解できないことも多かったけど

いまはもうただの罵倒合戦になっちゃったね残念です
0725デフォルトの名無しさん
垢版 |
2020/09/26(土) 15:47:25.99ID:ZTwAa6WW
>>723
説明したとおり、昔の処理系は移動した先のスタックエリアがそこに常にあるとは保証されないからその対応は必要。
今はユーザーモードならOSがスレッドコンテキストを保証してるから頭使わないだけ。
0726デフォルトの名無しさん
垢版 |
2020/09/26(土) 15:57:43.88ID:U+G6yEte
>>725
> 説明したとおり、昔の処理系は移動した先のスタックエリアがそこに常にあるとは保証されないからその対応は必要。
申し訳ないけど全然状況が想像できん、具体例で説明してくれ
0727デフォルトの名無しさん
垢版 |
2020/09/26(土) 16:18:49.58ID:ZTwAa6WW
スレッドセーフだったAPIがスレッドセーフじゃなくなりました!!
って言われて、はぁ?と言いながらソースを修正する、みたいな。こんな具体例でいいですか?
0728はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/26(土) 16:40:11.75ID:d+bfMgei
ワイはそこまで昔のことは知らんし、組み込み系の話もわからんけど、
MS-DOS (16bit) 時代のプログラミングの知識だと
データの位置はスタックポインタからの相対というだけではなく
セグメントレジスタの内容も加算される。

スタックセグメントレジスタとデータセグメントレジスタが一致するときは
単純なのだが、そうでないときはセグメントの値とセグメント内のオフセットを組にして
ポインタとして扱わなければならない。
(いわゆる far pointer のこと。
Windows SDK のヘッダファイルの中に near と far がマクロ定義されているのはたぶんそのなごり。)

C のプログラムとして書く分にはメモリモデル (セグメントの扱い) を決め打ちして、
コンパイラはそれに従って整合性を取ってくれるから素直な C プログラムなら問題にならないが、
凝ったメモリ管理をしようとするとそう単純にはいかないことはあったかもしれん。
0729デフォルトの名無しさん
垢版 |
2020/09/26(土) 17:22:32.99ID:U+G6yEte
>>727
ごめん、全然わからん
そもそもスレッドとかがある時代の話なの?

>>728
あなたも書いてる通りfarポインタでも
> コンパイラはそれに従って整合性を取ってくれるから素直な C プログラムなら問題にならない
のが普通
よほどトリッキーなことをすれば駄目なケースがあるのかも知れんが俺には思いつかん
0731デフォルトの名無しさん
垢版 |
2020/09/26(土) 17:35:47.60ID:U+G6yEte
>>730
スタック領域にメモリーコンパクション?
昔の処理系の割にスレッドとかメモリーコンパクションとかなかなか凝ったシステムやねw
0732デフォルトの名無しさん
垢版 |
2020/09/26(土) 17:36:30.11ID:JvTrRG8q
メモリーコンパクションて昔の処理系でしょ
今の処理系でやるやつあんの?w
0734デフォルトの名無しさん
垢版 |
2020/09/26(土) 17:55:50.69ID:U+G6yEte
昔といえば昔かな、>>725はもっと昔の話かと思ってたけど
で、メモリーコンパクションがどう関係するって?
0735デフォルトの名無しさん
垢版 |
2020/09/26(土) 18:03:51.62ID:ZTwAa6WW
これだけ説明して何も分からないならそれまででしょう。
OSに感謝してC++富豪プログラミングを謳歌してください。
0739はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/26(土) 23:28:50.69ID:d+bfMgei
>>729
ひとつのプログラムの中では整合性は維持されるけど、
別のタスクとやりとりするときにメモリモデルが違うと
near pointer と far pointer を明示的に使い分けないといけないことがある。

わかってればとりたてて難しいことではないのだけど、
言語仕様に沿ってれば後はコンパイラにお任せというわけにはいかない。
知ってる必要はあった。

話題の発端 (よりは少し後?) でスタックポインタとの相対番地は
呼出し側で計算するんだから……という話が出ていたので、
他の要素 (セグメント) が絡むアーキテクチャのことを思い出したなぁという余談。
0740デフォルトの名無しさん
垢版 |
2020/09/26(土) 23:47:45.08ID:Hf1Mq2xd
>>739
理解しているだけでなく、far というキーワードを
char far *ptr;
のように書いたりしなくてはいけなくて、面倒だった。
0741デフォルトの名無しさん
垢版 |
2020/09/27(日) 02:34:34.90ID:S4au1vJD
far ポインタ、今ここで見なければたぶん一生わすれたままだったのに
ちなみにMS-DOS時代は全部のセグメントをひとつにまとめた .COM っていう実行形式あったな
いまでも動くのかしらんけど
0742デフォルトの名無しさん
垢版 |
2020/09/27(日) 05:20:36.19ID:PnF6Ozyr

0743はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/27(日) 08:55:07.39ID:WOc0AJ0G
>>741
Windows では今でも com 形式を実行できるよ。
環境変数 PATHEXT の Windows でのデフォルト設定を見ればわかるが、先頭に com が入ってる。
(同じ名前であれば exe より com が優先されるということ。)

C:\Windows\System32 の下にはいくつか com 形式の実行ファイルはあるし。

ただ (com 形式に限らず) 昔のプログラムは直接にデバイスを叩いていたりして、
さすがにサポートしきれていない場合もあるから、昔のプログラムが何もかもそのまま
動くというほどではない。
0744デフォルトの名無しさん
垢版 |
2020/09/27(日) 08:59:30.78ID:p6y4XMAK
>>739
別に一つのプログラムの中でもnearとfarを混在できる
メモリーモデルはディフォルトのnear/farを決めてるだけだから異なるメモリーモデルのプログラムを混在させたなら相互に使用するデータやコードには個々にnear/farの指定をする必要があるのは当たり前
それを含めて言語仕様だし

>>740
char near * far f();
とか書き方がややこしいのは認める
0745デフォルトの名無しさん
垢版 |
2020/09/27(日) 09:33:39.25ID:QntRtEDW
>>743
たとえばC:\Windows\System32\format.comなんかあるけど
dumpbin /headers format.comとやると中身はexeだと出てくるぞ
masmに付いてたexe2binで出力した本当のtinyモデルのやつは
x86までで、x64のwindowsでは実行できんぞ
0746はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/27(日) 11:05:00.24ID:WOc0AJ0G
>>745
えっ、そうなんや!? それは知らんかった。
じゃあ拡張子が com なのはなんかの互換性とかの都合なのかな。
0747デフォルトの名無しさん
垢版 |
2020/09/27(日) 11:34:08.96ID:QntRtEDW
format.comはdosの時代からずっと拡張子.comのままだね
int 21h, ah=4bhで指定するファイル名が変わると困るから
0748デフォルトの名無しさん
垢版 |
2020/09/27(日) 11:41:49.52ID:QntRtEDW
ちなx64で16bitプログラムが実行できないのはm$の恣意的な制限で
ホストx64、ゲストx86のvmアンダーなら.com形式のプログラムも実行できる
0750デフォルトの名無しさん
垢版 |
2020/09/27(日) 12:21:08.36ID:B8/m6o5T
確か、int 21hのDOS Function Callは、今のWindowsではサポートされなく
なったと聞いた様な。
0752デフォルトの名無しさん
垢版 |
2020/09/27(日) 15:19:28.84ID:PnF6Ozyr
今に生きろよw
0753デフォルトの名無しさん
垢版 |
2020/09/27(日) 15:49:06.00ID:tl/HXTc2
じじいは昔話しだすと止まらなくなる
ボケてないんだったら自覚して自重しろ
0754デフォルトの名無しさん
垢版 |
2020/09/27(日) 16:17:04.29ID:kqCKlQkp
.comはCPMの名残だけど
全セグメントを一つにまとめたってのは
ちょっと違くないか?
別に違うセグメントにアクセスしても問題無く動いてたろ?
0755はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/09/27(日) 16:28:23.36ID:WOc0AJ0G
>>754
今でいうセクションみたいなことを言おうとしたんでしょ。
実行環境の話ではなくあくまでもファイルフォーマット。
0756◆QZaw55cn4c
垢版 |
2020/09/27(日) 16:35:25.79ID:LVdhYtmI
>>754
たぶん *.com と *.exe の違いはMS-DOS のイメージローダの都合、というものじゃないでしょうか?
*.exe はテキストの前に、セグメントアロケーション情報を持っていて、実行ファイルをロードする歳に、関係するセグメントオフセットを実セグメントに変更します
*.com にはそれがなく、生のテキストがメモリ上に配置されるだけ

*.com であってもプログラマが自分でオフセット・セグメントを把握したり、スタックポインタ・スタックセグメントを設定しているのだったら、それはそれで問題なく動くでしょう
0758デフォルトの名無しさん
垢版 |
2020/09/27(日) 19:47:03.79ID:SosvOXW5
PC9801の頃に、漢字 2字? のファイルを comで保存して、IPLん走らせるみたいのあったな
たしかその 4バイトは 0番地に分岐する命令だったような
0760デフォルトの名無しさん
垢版 |
2020/09/28(月) 11:44:17.88ID:PXJ7xAyj
美乳
0763デフォルトの名無しさん
垢版 |
2020/09/30(水) 20:39:25.56ID:48ryTnta
_DEBUG で区切っているコードがあり、
releaseモードで実行したのに
_DEBUGで切っているコードを実行されてしまいます。
プロジェクトプロパティにて宣言していないのは確認しています。
なにか解決になるヒントだけでもいただけないでしょうか?
0765デフォルトの名無しさん
垢版 |
2020/09/30(水) 22:08:07.49ID:48ryTnta
>>764
スレチすみませんでした。
0766デフォルトの名無しさん
垢版 |
2020/10/01(木) 09:15:47.76ID:oZeTafce
Releaseモードにしたとき自動で入るのはNDEBUGだろ
その昔、ソースコードの中で#undefしてる大タコなやつがいた
0767デフォルトの名無しさん
垢版 |
2020/10/01(木) 12:08:12.26ID:OaA9a4hN
間接話法による自己紹介とはなんと慎み深いお方なんだ
0768デフォルトの名無しさん
垢版 |
2020/10/01(木) 13:35:09.79ID:27/Dd+rP
ここ見てるとC++使いは性格悪いのが多いって感じがする
0769デフォルトの名無しさん
垢版 |
2020/10/01(木) 14:16:23.58ID:QPXIh54Z
昔はこのスレももっとまともな人が多かったと思うけど、いつの間にか一部のガラの悪い奴らの下らない罵り合いばかり見せられて人が去っていったのかなと思う。
0770デフォルトの名無しさん
垢版 |
2020/10/01(木) 14:19:30.67ID:WQPTDVBo
ここで聞くより調べたほうが大抵早いし
なんでこんなところに来るのかわかんない
0771はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/10/01(木) 14:31:52.80ID:i8Yvf3kp
入り組んだ仕様の組み合わせで起こることならともかく、
簡単に調べられることだと回答も仕様 (またはどっかの解説)
をコピペするか URL を貼るだけになるからつまらんのだよなー。
そのワンステップ必要? という気持ちにはなる。

本物の初心者がそれすらできないことがあるのも知ってるから、
あまり無碍にはしないようにしてるけど、
つまらんなーという気持ちは残る。
0772デフォルトの名無しさん
垢版 |
2020/10/01(木) 14:45:07.87ID:27/Dd+rP
>>770
見事な自己矛盾
0773デフォルトの名無しさん
垢版 |
2020/10/01(木) 14:58:05.69ID:WQPTDVBo
別に質問しに来てるわけじゃないからな
質問する人がどういう経路で来るのか気になる
0774デフォルトの名無しさん
垢版 |
2020/10/01(木) 15:04:41.08ID:15Icpaxe
>>769
2|5ちゃん全体がそれ
0775デフォルトの名無しさん
垢版 |
2020/10/01(木) 16:59:28.58ID:ECwAm/rR
まじでc++ユーザー煽り合いしか出来ねーな
普通に教えられないのか?
そのくせTwitterでは、新人への対応がーとか云々社内のこと愚痴る癖に人の振り見て我が振り直せって感じ
0776デフォルトの名無しさん
垢版 |
2020/10/01(木) 17:01:21.71ID:C7xRzI9k
コード書かないC++委員会の言語オタクどもが仕様拡張病を患ってるから
仕様を知ってる知らないレベルでマウンティング合戦になるんだよな。
■ このスレッドは過去ログ倉庫に格納されています

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