- 1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C23 最新ドラフト https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 160 https://mevius.5ch.net/test/read.cgi/tech/1672191630/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 582 名前:デフォルトの名無しさん (ワッチョイ ffad-5+Xn) [2023/09/02(土) 00:41:32.42 ID:VX6uRHRw0.net]
- farポインタみたいにバイト数の違うポインタも混在していたら余計にややこしい問題に・・・
- 583 名前:デフォルトの名無しさん (テテンテンテン MM7f-cJIa) mailto:sage [2023/09/02(土) 01:01:48.59 ID:WsIZ4FVlM.net]
- 例えばFILE*とshort*ならアドレスのアライメントが合わない場合があるだろうけど、これはそもそも型が適合しないわけでどうしようもない
でも、今考えたらvoid*はありとあらゆるアドレスを取る可能性が有るから、それに合うのはchar*しかないよ、ということを言いたかったのだろうなと気付いた でも規格書を見ても、FILE*とvoid*が適合するかどうかはアンドキュメンテッドだなw 現実には((void*)0)とFILE*は完全に適合してるけどね
- 584 名前:551 (ワッチョイ 2320-+GqY) mailto:sage [2023/09/02(土) 06:58:16.01 ID:XjF1xIbI0.net]
- ここにこう書いてあるからには、何か(通常の関数呼び出しでは
問題にならないが)可変長引数特有の問題があり、 それを避けるためにこうしたのだろう、と思った訳です。
- 585 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 11:49:29.07 ID:+azsBNOBd.net]
- >>579
そんな保証はまったくない 例えばmallocの場合戻り値は「あらゆる組み込み型に対応できるようにアラインメントされる」と特に注釈されている 逆に言えばvoid*はどんなポインタにキャストしても安全と思い込みがちだがそんなことはないということ >>582 通常の呼び出しなら型チェックが働くが可変長呼び出しでは一切働かないという注意だろう 最近のprintfは型チェックされるようになってるけど
- 586 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/02(土) 11:59:23.66 ID:R1w1jy3B0.net]
- 安全かどうかは、環境によるんじゃ
- 587 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 12:34:31.87 ID:DeBIPPsBd.net]
- 「環境による」のは安全ではないんだよ
ここで取り上げられてるのは大元の公式文書なのであらゆる環境について言えることが書いてある
- 588 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/02(土) 12:59:05.22 ID:R1w1jy3B0.net]
- マイナーなCPUのことなんか気にしたことがなかったな
- 589 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va) mailto:sage [2023/09/02(土) 13:12:11.45 ID:Ng1Dtdjk0.net]
- >>584
現在の文脈では「言語仕様をそう決めた理由」が主題。 だからその前提として言語仕様が保証している範囲がどこまでかを 理解しておく必要があって、そこで見当違いの主張に反論がされている という話の流れ。
- 590 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 14:05:43.49 ID:DeBIPPsBd.net]
- >>586
「可搬性」という概念はCでは大事 マイナーなCPUのみならず将来的に登場する高性能だが制限が多いCPUでも手直しせずに動かせるということもあるかもしれない
- 591 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/02(土) 14:41:25.26 ID:Ng1Dtdjk0.net]
- 必要なら環境依存なことをしやすいのも C の良いところだが
不必要な依存は避けるに越したことはないわな
- 592 名前:デフォルトの名無しさん (アウアウウー Sae7-fXI3) [2023/09/02(土) 14:45:40.34 ID:mCX3wjBNa.net]
- FILE *fp = fopen(...);
void *hoge = (void *)fp; FILE *fuga = (FILE *)hoge; みたいなことは禁止されてる?
- 593 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 14:59:50.63 ID:wu0IBgrgd.net]
- どうしても必要ならやるしかない
ただfopenの戻り値でFILE構造体の安全性が保証されてるのにわざわざvoid*に代入してからFILE*に戻すのは 正統な金なのに闇銀行に預けて再びマネーロンダリングするような変な手間だ
- 594 名前:デフォルトの名無しさん (ラクッペペ MM7f-ymsf) mailto:sage [2023/09/02(土) 15:08:48.05 ID:68c+QhTKM.net]
- void *型って参照する先の変数のサイズが不明なので右辺値になるのは不可能な気がするけどな
キャストは無理でしょ
- 595 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/02(土) 15:12:41.39 ID:Ng1Dtdjk0.net]
- >>590
オブジェクトを指す (つまり関数ポインタではない) ポインタを void* に変換してから元の型に変換すると 元のオブジェクトと等しいことは保証されている。
- 596 名前:デフォルトの名無しさん (アウアウウー Sae7-fXI3) [2023/09/02(土) 15:26:23.14 ID:mCX3wjBNa.net]
- >>592
void じゃなくてもいいや FILE *fp = fopen(...); char *hoge = (char *)fp; FILE *fuga = (FILE *)hoge; みたいなことは禁止されてる?
- 597 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 15:40:22.87 ID:iw53wgLpd.net]
- >>592
なんで? ポインタはメモリ上の一点を指すもので インクリメントデクリメントが不可能なだけで キャストは可能 >>594 いったい何が聞きたいんだ? 禁止はされてないよ ただこれ見たプログラマは皆「バカだなあw」とは言うだろうw
- 598 名前:デフォルトの名無しさん (ワッチョイ 7310-/gcr) mailto:sage [2023/09/02(土) 15:52:38.82 ID:f6/YEIJg0.net]
- 言葉をちゃんと使うとプログラマ意思疎通がよくなるのでは。
「void * が右辺値になるのは無理」って何だよ。ではなく、正常動作はプログラマの責任になる、って言いたかったんじゃないの? >>590 みたいなコードは、これだけなら疑問に思うだろうが、こういうコードが有効になる事はあるよ。その一例は 「ここで言うFILE* みたいなモノが複数種類あり」 送信側 - 中継機能 - 受信側 のプログラム構造で送受信のペアは複数あり、中継機能には 実際の中身が何なのかは意識させたくない。 ---- ポインタの話から外れて恐縮だが、 例としてタグ・レングス・バリュー形式ってのがあって、「中継者は送受信データがTLV形式の連続であることだけは知っていて」「TとLのサイズは一定」「タグの種類が何種類あるかなんて知らなくていい」 ---- これにさらにポインタを含むデータ構造を通信可能にするには?って話で、ポインタ型をバッファ内インデックス値に変換して、ポインタが指す中身も通信データに含める、とか、 サブ構造がポインタ持ってたら再帰的に処理する、とか話は続くが それはいいとして >>590 みたいなコードは、現実にはあるよ。という話
- 599 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/02(土) 16:04:16.63 ID:Ng1Dtdjk0.net]
- >>594
オブジェクトを指すポインタは char* (またはその他の文字型をさすポインタ) へ変換することは許されるし文字配列として読んでもよい。 (読んだ結果としてどういうレイアウトになってるかはわからんけど。) そしてもとの型に型変換したら変換前と等しいことも保証される。
- 600 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 16:06:19.94 ID:Yxb8XUhFd.net]
- たしかに言い方が悪かったので
>>592 ポインタは元々サイズは無いもので 対象オブジェクトの先頭アドレスの一点だけを指してるから void*を含むどんなポインタもキャストすれば力づくで代入できる ただvoid*にはサイズがないのでinc dec(加減演算)をしようとするとエラーになる >>594 どんなキャストも禁止されてはいないが プログラマの責任によって成される最後の手段だと思ったほうがいい 見つかりにくいバグの原因になるので ソースにコメントで理由を明示しておいたほうがいい
- 601 名前:デフォルトの名無しさん (ワッチョイ 7310-/gcr) mailto:sage [2023/09/02(土) 16:12:48.48 ID:f6/YEIJg0.net]
- うーん
まだまだ添削できる余地があるぞ… ここはまあ無料掲示板だが、仕事では、自分には誤解をされやすい性質がある、と意識しなされ
- 602 名前:デフォルトの名無しさん (スプープ Sd1f-I+Vk) mailto:sage [2023/09/02(土) 16:50:14.84 ID:JxIOKPq6d.net]
- アハハ
なんだこの人w
- 603 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/02(土) 17:10:38.18 ID:R1w1jy3B0.net]
- ここでお金稼ぎしている人いたっけなw
- 604 名前:デフォルトの名無しさん (ワンミングク MM9f-hgj0) mailto:sage [2023/09/02(土) 21:43:01.25 ID:5XlbVKpsM.net]
- もりたぼ稼ごうとした人はいた
- 605 名前:デフォルトの名無しさん (ワッチョイ b35f-RK05) [2023/09/02(土) 22:10:43.72 ID:9Zs5bzSj0.net]
- ポインタの宣言は、ポインタの型じゃなくて、ポインタが指しているアドレスの格納値をどう扱うつもりなのかを明示している。
void型のポインタは、ポインタだから、何型のポインタだから、64ビットだったり、32ビットだったりするものではない。
- 606 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va) mailto:sage [2023/09/03(日) 13:47:13.05 ID:ApaaLf4l0.net]
- >>603
同じでなければならないという規定はない。 実際に異なる実装が存在するのかどうかは知らんけど。
- 607 名前:デフォルトの名無しさん (スププ Sd1f-ETx6) [2023/09/04(月) 07:48:03.87 ID:63U36j7Od.net]
- >>594
void void * 登場前の C は FILE *fp = fopen(...); int *hoge = (int *)fp; FILE *fuga = (FILE *)hoge; だったんじゃないかな
- 608 名前:デフォルトの名無しさん (ワッチョイ 8310-g4sH) mailto:sage [2023/09/04(月) 07:53:14.39 ID:YGQMN8Uj0.net]
- 設計当時はアセンブラの代替言語。
- 609 名前:デフォルトの名無しさん (スッププ Sd1f-I+Vk) mailto:sage [2023/09/04(月) 09:48:09.59 ID:R5PUsxPld.net]
- >>605
基本はcharだからchar *hoge = (char *)fp;じゃない なんならint hoge = (int )fp;でもよかった ほとんどの場合intとポインタのサイズが同じだった
- 610 名前:デフォルトの名無しさん (アウアウウー Sae7-fXI3) [2023/09/04(月) 10:04:32.23 ID:/ASAZOX6a.net]
- >>607 みたいなのがいるから void が出来たんだよ
- 611 名前:デフォルトの名無しさん (スプッッ Sd87-IP2U) mailto:sage [2023/09/04(月) 11:07:54.13 ID:gab4BDOud.net]
- 因果逆転だな
- 612 名前:デフォルトの名無しさん (ワッチョイ 7310-/gcr) mailto:sage [2023/09/04(月) 11:19:05.30 ID:Ww8QJvvD0.net]
- >>607
ウソはだめだ。 俺が見逃しても、はちみつ先生に定規でケツはたかれるぞ
- 613 名前:デフォルトの名無しさん (ワッチョイ 7310-/gcr) mailto:sage [2023/09/04(月) 11:24:33.03 ID:Ww8QJvvD0.net]
- そういえば、むかーしの情報処理試験には言語選択でマシン語ってのがあって、1メモリアドレス値が指すメモリは 8bit 幅ではなく、 16bit だったように記憶してる。
「特殊な環境を想定しやがって…」と思ったナカマいない?
- 614 名前:デフォルトの名無しさん (ワッチョイ 8310-g4sH) mailto:sage [2023/09/04(月) 11:27:19.73 ID:YGQMN8Uj0.net]
- 試験用アセンブラはCASLだったっけ?
仮想環境で実在しない環境用言語だって。
- 615 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va) mailto:sage [2023/09/04(月) 12:00:00.02 ID:p8KSFCIf0.net]
- >>610
char* はどのポインタからも変換できるし 元の型に変換すれば元のポインタと等しいことは保証される。 好ましいとは言えないが変換自体は問題ない。 void* 登場前には (void* 的なことが必要なら) char* が使われていたのは本当だ。 ポインタから整数へも型変換できることは明記されてる。 その結果は処理系定義だが、出来る環境でやるのが悪いわけじゃない。 char* やら int やらで扱ってたら間違った取り扱いをしやすいので 可能なら避けたほうがよくは有るが、 >>607 が言及した範囲には 明瞭に間違いと言えるものは見つけられない。
- 616 名前:デフォルトの名無しさん (テテンテンテン MM7f-cJIa) mailto:sage [2023/09/04(月) 12:00:22.47 ID:5denWoTkM.net]
- メモリが8bitって何も出来ないぞw
- 617 名前:デフォルトの名無しさん (ラクッペペ MM7f-ymsf) mailto:sage [2023/09/04(月) 12:05:38.98 ID:QM+pFggQM.net]
- アドレス範囲ではなくてデータ長が16ビットだったと思う
- 618 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va) mailto:sage [2023/09/04(月) 12:09:35.09 ID:p8KSFCIf0.net]
- >>611
C の仕様上の用語では「バイト」が 8bit とは限らない定義になっている。 C の仕様で想定する必要がある程度にはそういう環境もあったのだろうし、 主流ではないにしても特殊というほどの感じでもなかったんちゃうか? まあ「昔」をいつ頃に想定するかにもよるだろうけど。
- 619 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-A0va) mailto:sage [2023/09/04(月) 12:24:06.96 ID:p8KSFCIf0.net]
- >>612
たぶんだけど >>611 が言うのは CASL の前身である CAP-X のことじゃないか? 16bit 単位でアドレスが振られる設計だったはず。
- 620 名前:デフォルトの名無しさん (ワッチョイ 93c9-oCRc) mailto:sage [2023/09/04(月) 14:04:31.55 ID:F3cE7vUV0.net]
- 7bitでアルファベットは表せてたしねぇ
文字集合で完結させてた RFC822
- 621 名前:デフォルトの名無しさん (ワッチョイ 6f5f-ATpV) mailto:sage [2023/09/04(月) 20:56:26.82 ID:MxCwE5tq0.net]
- 実際に1バイトが8ビットじゃないマシンで仕事してた人いる?
経験談を聞いてみたい つらそう
- 622 名前:デフォルトの名無しさん (ワッチョイ b302-jP38) mailto:sage [2023/09/04(月) 21:41:24.34 ID:TqSqVDXY0.net]
- 何がつらいの?
- 623 名前:デフォルトの名無しさん (スッププ Sd1f-I+Vk) mailto:sage [2023/09/04(月) 22:35:30.73 ID:yuyUlcPSd.net]
- UNIXとか基本9ビットが見え隠れしてる気がする
ファイルのパーミッション---rwxrwxとか C数値のデフォルトが8進数とか(9ビットなら8進数3ケタでまとまりがいい)
- 624 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/04(月) 22:55:40.14 ID:ljnGjc/80.net]
- あれは9ビットだったのか
- 625 名前:デフォルトの名無しさん (テテンテンテン MM7f-cJIa) mailto:sage [2023/09/04(月) 23:38:31.34 ID:5denWoTkM.net]
- 1バイト9bitとか完全に都市伝説だろ…
1ワード(レジスタ)が36bitとかはLispマシーンで使われたりしてたけどね
- 626 名前:デフォルトの名無しさん (ワッチョイ 23f0-BDBD) mailto:sage [2023/09/06(水) 06:22:01.74 ID:r3vK0XzD0.net]
- char が16bitの環境なら使ったことがある
- 627 名前:デフォルトの名無しさん (ワッチョイ 4301-yzHn) mailto:sage [2023/09/06(水) 07:02:16.45 ID:Mh27mgbM0.net]
- そういうのってどんなCPUなの?
- 628 名前:デフォルトの名無しさん (ワッチョイ cfcf-ATpV) [2023/09/06(水) 09:37:16.14 ID:EGh1VJfR0.net]
- とりあえずDSPなんかはそうでしょ
ワードマシンって言っちゃっていいか知らんけど、演算の速度をあげるためにワード幅を一番使いそうなビット数にして全部ワード単位でアクセスする設計にしてる マニュアルにアドレス、char幅、int幅全部同じ何々ビットです注意してねみたいなのがご丁寧に書いてあったりするよ
- 629 名前:デフォルトの名無しさん (スフッ Sd1f-ETx6) [2023/09/06(水) 11:10:12.82 ID:QkmiSIQgd.net]
- >>622
12bit以上必要だったはず
- 630 名前:デフォルトの名無しさん (ワッチョイ 7310-/gcr) mailto:sage [2023/09/06(水) 11:35:53.69 ID:HQrnJbDO0.net]
- >>626
勉強になります DSP触った事ないや
- 631 名前:デフォルトの名無しさん (ワッチョイ cfab-oCRc) mailto:sage [2023/09/06(水) 12:07:23.88 ID:TIQAYIu40.net]
- >>626
float 幅に全揃え アドレッシングもその単位なのでどうしても細かい粒度で個別に演算処理したい時はビットシフト併用 とかあったなぁ
- 632 名前:デフォルトの名無しさん (ラクッペペ MM7f-gKm6) mailto:sage [2023/09/06(水) 15:01:09.34 ID:7li0jtwXM.net]
- よく分からんけどDSPの内部レジスタって直接浮動少数点数が扱えるのか
floatは符号1bit + 指数部8bit +仮数部23bitの32bit長だっけ? ただ浮動少数点数でビットシフトって面倒くさそう
- 633 名前:デフォルトの名無しさん (ワッチョイ 23f0-BDBD) mailto:sage [2023/09/06(水) 19:43:08.02 ID:r3vK0XzD0.net]
- 外部とやり取りが多少面倒
ファイルや通信関連 データ列をcharに8bitずつ入れるか ケチって8bit x2 入れるか なんかを考える必要がある
- 634 名前:デフォルトの名無しさん (ワッチョイ 23f0-BDBD) mailto:sage [2023/09/06(水) 19:43:50.40 ID:r3vK0XzD0.net]
- 私が使ったのはDSPでした
- 635 名前:デフォルトの名無しさん (ワッチョイ 23f0-BDBD) mailto:sage [2023/09/06(水) 19:45:03.72 ID:r3vK0XzD0.net]
- 昔の大型計算機でcharが64bitのがあったはず
- 636 名前:デフォルトの名無しさん (ワッチョイ cf63-yzHn) mailto:sage [2023/09/06(水) 20:55:53.98 ID:6iN9QRCz0.net]
- 最初のUNIX開発マシン、DECの PDP-7 は18ビットだった
- 637 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/07(木) 00:34:19.14 ID:n7kUX99P0.net]
- C の仕様では正数型の表現にパディングビットの存在を許しているんだけど値の表現に関わらない無意味なビット(特殊なフラグとかに使うのか?)が存在するアーキテクチャも、見たことはないけど C の仕様で想定している以上はたぶんあるんだろうな……
- 638 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-QWOy) mailto:sage [2023/09/07(木) 00:34:47.43 ID:n7kUX99P0.net]
- 誤植
正数→整数
- 639 名前:デフォルトの名無しさん (ワッチョイ 23f0-BDBD) mailto:sage [2023/09/07(木) 08:06:18.17 ID:YzioMxaL0.net]
- >>635
小数なら身近にあるね
- 640 名前:デフォルトの名無しさん (ワッチョイ ff97-EEOY) mailto:sage [2023/09/07(木) 12:49:26.03 ID:6eZunc+30.net]
- 隣で寝ている
- 641 名前:デフォルトの名無しさん (ワッチョイ 0f01-e7Rb) [2023/09/16(土) 10:51:51.48 ID:S5cqLcA00.net]
- T,o,k(迷惑という方は←をあぼーんしてください。)
更に家族友人にも教えて加えて¥4000×人数をGETできます https://i.imgur.com/dGH5X8i.jpg
- 642 名前:デフォルトの名無しさん (アウアウウー Sa53-HRje) [2023/09/16(土) 12:25:15.03 ID:RATZO/gia.net]
- しね
- 643 名前:デフォルトの名無しさん (ワッチョイ 0f01-R46v) mailto:sage [2023/09/16(土) 12:35:05.81 ID:n1ZKqkE80.net]
- >>639
PayPayに変換できるって知らなかった
- 644 名前:デフォルトの名無しさん (ワッチョイ 7f63-VRQG) mailto:sage [2023/09/16(土) 12:38:47.03 ID:NMUMDiAt0.net]
- あそこはEUから莫大な賠償金請求されたから、必死なんだろう
- 645 名前:デフォルトの名無しさん (ワッチョイ 3fad-xbk3) [2023/09/16(土) 12:48:52.21 ID:8u+hT5wA0.net]
- >>639
グロ
- 646 名前:デフォルトの名無しさん (ワッチョイ 4fb0-gBtz) [2023/09/22(金) 10:15:48.77 ID:wJrbx3oK0.net]
- なあ、いつから子関数内で宣言した自動変数を戻り値に使って親関数で参照してもアクセスエラーにならなくなったんだ?
特に構造体とか
- 647 名前:デフォルトの名無しさん (ワッチョイ 7f63-VRQG) mailto:sage [2023/09/22(金) 10:51:22.61 ID:tfij4Zir0.net]
- 自動変数を参照渡ししてるのか?
- 648 名前:デフォルトの名無しさん (ワッチョイ 3f65-V30e) mailto:sage [2023/09/22(金) 11:07:25.29 ID:8SLDLfd50.net]
- アクセスエラーってのが実行時の話なら動作環境教えてくれないとなんとも
- 649 名前:デフォルトの名無しさん (ワッチョイ 4f93-uKg7) mailto:sage [2023/09/22(金) 11:08:43.04 ID:X0VLPMl/0.net]
- すんません何を言ってるのか分からん
自動変数のアドレスを返す話? OSとかコンパイラとか色々わからないと空虚な話になりそう、ってのと(特殊な環境なのでは) エラーになって欲しいのにならなくて 同僚がアホで困ってて 強制的にエラーにしたいって話?
- 650 名前:デフォルトの名無しさん (ワッチョイ 0f10-NfV8) mailto:sage [2023/09/22(金) 11:13:15.28 ID:z1xJQo5k0.net]
- 数年に1回ほぼVC++でほぼCのコード書いてコンパイルしてるけど、
なんか最新版入れる度にデフォのエラー基準厳しくなっていく・・・。 変数定義をgoto(エラー処理)ですっ飛ばからエラーって・・・昔のCみたいに関数先頭に記述を移動する羽目に・・・ 警告でいいやん。
- 651 名前:デフォルトの名無しさん (ワッチョイ 7f63-VRQG) mailto:sage [2023/09/22(金) 11:16:56.77 ID:tfij4Zir0.net]
- 構造体で返すにしても、呼出元って用意した変数なり構造体で受け取るんだろう
- 652 名前:デフォルトの名無しさん (ワッチョイ 3fad-d4nU) [2023/09/22(金) 11:27:24.08 ID:ZXfr4S/70.net]
- >>644
構造体の変数を戻り値に使うことは結構最初の頃から出来たと思うが、昔のマイコンは遅かったのでなるべく使わないで呼ぶ側で変数作ってそのポインタ渡してそこに値入れてもらうみたいな事してたよ。 なんで遅いのかっていうと、参照などという高度なワザは使ってなくて他のintとかの変数と同様に構造体の内容をコピーしているだけだからだ。
- 653 名前:デフォルトの名無しさん (ワッチョイ 7f63-VRQG) mailto:sage [2023/09/22(金) 11:28:55.72 ID:tfij4Zir0.net]
- 共用体で渡したときは、どのメンバー使ってコピーするの?
- 654 名前:デフォルトの名無しさん (アウアウウー Sa53-9C00) [2023/09/22(金) 12:01:20.53 ID:dkRHHNCea.net]
- 池沼か
- 655 名前:デフォルトの名無しさん (ワッチョイ 4fb0-gBtz) [2023/09/22(金) 12:15:37.49 ID:wJrbx3oK0.net]
- >>650
処理系によってはポインター渡しになってたはず 自動変数はスタック上に領域確保するので 実体渡しじゃ無いとスタック壊れてるよね?
- 656 名前:デフォルトの名無しさん (ブーイモ MM5f-C+1d) mailto:sage [2023/09/22(金) 12:21:54.90 ID:+zFc5v5MM.net]
- 初期K&Rじゃ構造体returnはなくてポータブルC以降じゃね?
- 657 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4f3e-7CbB) mailto:sage [2023/09/22(金) 14:01:49.98 ID:jd4xXbI20.net]
- 構造体を返却値にするときは、
一般的なパソコンでの呼出し規約 (Windows や System V ABI) では 呼出し側で領域を用意してそのアドレスを暗黙の引数として渡す仕組みになってる。 用意された領域の上に最初から値を直接に構築できることもあるので そういうときはコピーコストは発生しない。 単純な関数、かつモダンなコンパイラを使ってるときは余計な工夫をする必要はないよ。
- 658 名前:デフォルトの名無しさん (ワッチョイ 4fb0-gBtz) [2023/09/22(金) 14:35:59.04 ID:wJrbx3oK0.net]
- 戻り値に構造体を使いたいんですぅ
- 659 名前:デフォルトの名無しさん (ワッチョイ 7fab-fp56) mailto:sage [2023/09/22(金) 14:53:23.56 ID:HzXlnxdE0.net]
- 参照てか自動変数へのポインタを戻してたってこと?
struct foo * hoge() { struct foo body; retrun &body; } これ未定義だからどうとでもなってしまうんじゃなかったかな… コンパイラが気を利かしてエラーや警告にするのも そのまま実行コードを生成して想定外の動きをするのも
- 660 名前:デフォルトの名無しさん (アウアウウー Sa53-9C00) [2023/09/22(金) 15:05:47.80 ID:dkRHHNCea.net]
- >>656
これでいいだろ struct Hoge *fuga(struct Hoge *param0, int param1, char *param2){ 何かする return param0; }
- 661 名前:デフォルトの名無しさん (ワッチョイ 4fb0-gBtz) [2023/09/22(金) 15:07:59.94 ID:wJrbx3oK0.net]
- 受ける側が用意しなあかんかぁ
- 662 名前:デフォルトの名無しさん (ワッチョイ 7fab-fp56) mailto:sage [2023/09/22(金) 15:08:23.02 ID:HzXlnxdE0.net]
- >>657 のは、OS側のメモリに対する不正アクセスに引っかかって
エラー発報になるのは少ないんじゃないかな? (戻りの自動変数のポインタが不正アクセスになる可能性は低い) 構造体の中にさらにポインタをつかってて、ゴミなポインタ値で実体見に行ってやっと上記が発動する struct foo { struct foo* next; int body; }; こんなので ret->next->body; とやったら *ret の内容がゴミ = ret->next も不定な値 ret->next->body でメモリの不正アクセス
- 663 名前:デフォルトの名無しさん (ワッチョイ 4fb0-gBtz) [2023/09/22(金) 15:09:39.40 ID:wJrbx3oK0.net]
- 割り込み処理があると簡単に死ぬよ
- 664 名前:デフォルトの名無しさん (ワッチョイ 7fab-fp56) mailto:sage [2023/09/22(金) 15:10:08.95 ID:HzXlnxdE0.net]
- ハイコストなのをわかってて実体をそのまま返すことはあった
複素数を取り扱う Complex 構造体で 式の形式にしたくて ね
- 665 名前:デフォルトの名無しさん (ワッチョイ 7fab-fp56) mailto:sage [2023/09/22(金) 15:11:28.51 ID:HzXlnxdE0.net]
- >>661
割り込み想定するなら呼び出し元で器渡しとけって話にしかならんじゃろ
- 666 名前:デフォルトの名無しさん (スッップ Sd5f-8KNq) mailto:sage [2023/09/22(金) 15:14:27.76 ID:wMC0ce2ad.net]
- >>653
返値用にもスタックが用意されてる 特にサイズが自由に定義できる構造体では戻り値にレジスタは使えんだろう
- 667 名前:デフォルトの名無しさん (ワッチョイ 7fab-fp56) mailto:sage [2023/09/22(金) 15:27:37.08 ID:HzXlnxdE0.net]
- ID:wJrbx3oK0 がどういう環境で愚痴ってるのかはわからんけど
「割り込みハンドラ内でいろいろやるのをCで記述してるんだけど…」とかだったら 極力スタックは少なくしたい って話に行き着くけども それならなおさら器は呼び出し側で用意すべし になるよなぁ 最悪関数呼び出しのオーバーヘッドも嫌って きもいマクロ関数が並ぶことも
- 668 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4f3e-7CbB) mailto:sage [2023/09/22(金) 15:30:18.99 ID:jd4xXbI20.net]
- 似たような話題が出たことがあるような気がしたので思い返してみると C++ スレの話だったわ。
コピーの省略 (copy elision) が保証される場合がどう実装されているのかという話題で オブジェクトを構築すべき場所を呼び出し側が暗黙に渡してるから 最初からそこに構築される (のでコピーする必要がない) というのが一般的な実装で、 たぶん C の構造体受け渡しで実績があったから C++ では言語仕様として取り込めたんだな。
- 669 名前:デフォルトの名無しさん (アウアウウー Sacf-PB4I) [2023/09/23(土) 10:05:20.89 ID:i9fpyxKga.net]
- thisのことですか
- 670 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 273e-ClgD) mailto:sage [2023/09/23(土) 10:39:49.55 ID:ALqEUzvh0.net]
- >>667
返却値のこと。 コンストラクタの場合は結果的に this でもあるとは言えるけど
- 671 名前:デフォルトの名無しさん (ワッチョイ 3b93-gtrM) mailto:sage [2023/09/23(土) 18:43:05.31 ID:lGebHJu00.net]
- c言語にthisは無い
- 672 名前:デフォルトの名無しさん (スッップ Sdaa-cHxT) mailto:sage [2023/09/23(土) 19:21:52.16 ID:h4supWEzd.net]
- thisはポインタなので実体を返すとか言う話とは関係ない
- 673 名前:デフォルトの名無しさん (ワッチョイ 8661-gIzx) mailto:sage [2023/09/23(土) 21:37:44.48 ID:wNThSPil0.net]
- x86-64のABIでは、16byte未満はレジスタで渡されて、それ以上はメモリコピーが発生する、それだけ
- 674 名前:デフォルトの名無しさん (ワッチョイ bb48-NSUt) mailto:sage [2023/09/24(日) 01:41:30.54 ID:XDqOvN5B0.net]
- PODっていうんだっけ
構造体が値わたしになるやつ これはC++だったかな?Cはよくわからん
- 675 名前:デフォルトの名無しさん (アウアウウー Sacf-PB4I) [2023/09/24(日) 09:28:36.38 ID:2YTVyUlCa.net]
- レジスタが64bit=8bytes
レジスタが128bit=16bytes たしかにレジスタで全部返せるな
- 676 名前:デフォルトの名無しさん (ワッチョイ 1e63-CSnM) mailto:sage [2023/09/24(日) 09:55:18.81 ID:D6DOZoEp0.net]
- そのうち無限長レジスタ出てくるだろ
- 677 名前:デフォルトの名無しさん (ワッチョイ 8a79-aeRl) mailto:sage [2023/09/24(日) 11:19:45.97 ID:Cw9+et/n0.net]
- 映画化決定 鬼滅の刃 - 無限長レジスタ編
- 678 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 273e-ClgD) mailto:sage [2023/09/24(日) 11:48:58.25 ID:wtxuVbIF0.net]
- >>672
C++ 的にはクラスが一定の条件を満たすと C の構造体と互換性があるような性質を持つ。 それが POD。 C++ の POD のことも慣例で構造体と呼んでると思うので、 C の構造体 ≒ C++ の POD みたいな感じ。 POD は値渡しがどうこうとは無関係。
- 679 名前:デフォルトの名無しさん (スッップ Sdaa-cHxT) mailto:sage [2023/09/24(日) 18:47:28.19 ID:zJPvjQK3d.net]
- >>674
あえてマジレスすると RISCはレジスタ減らす傾向があるのでそれはない 近年のCPUはキャッシュがバカでかいのでレジスタを大きくする必要はあんまりない
- 680 名前:デフォルトの名無しさん (ワッチョイ 0761-+HDL) mailto:sage [2023/09/24(日) 19:03:57.96 ID:SWucSPIu0.net]
- Plain Old Data だね。
ちゃんとした英語だと、dの繰り返しを避けて Plain Ol' Data とするらしい 最新のC++はPODっていう呼び名を廃止したんじゃ無かった?
- 681 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 273e-ClgD) mailto:sage [2023/09/24(日) 19:10:57.73 ID:wtxuVbIF0.net]
- >>678
概念は廃止した (性質をスタンダードレイアウトとトリビアルに分割して説明している) けど std::is_pod がまだ有るので 「POD がなくなった」と言えるかどうかはちょっと微妙なところ。
- 682 名前:デフォルトの名無しさん (ワッチョイ 3b93-gtrM) mailto:sage [2023/09/24(日) 19:39:45.99 ID:iqjAJ+9f0.net]
- >>674
無限では無いけど VLIW って聞いた事無いのかw❤
|

|