【初心者歓迎】C/C++室 Ver.102【環境依存OK】

1デフォルトの名無しさん2017/11/04(土) 16:33:35.07ID:NYxCuvMY
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/

734デフォルトの名無しさん2018/05/06(日) 00:56:59.17ID:G6stHO5N
>>732
初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?

735はちみつ餃子 ◆8X2XSCHEME 2018/05/06(日) 02:31:33.69ID:ATh7OHAm
繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。
こっちの手段もアリだよね? っていう別の質問。

736デフォルトの名無しさん2018/05/09(水) 14:30:37.57ID:YgEwOBRT
競技プログラミングってやった方がいいんですか?

737 ◆QZaw55cn4c 2018/05/09(水) 16:44:52.51ID:dHqNIKDN
>>736
競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、
競プロをやりたいとは思わないなあ…

738デフォルトの名無しさん2018/05/09(水) 17:28:08.89ID:bhGLBTeZ
ロベールの本に以下のコードがあります。
buf という配列ですが、 for 文の中で宣言されています。
PAGE_HEIGHT 回、配列 buf が作られるのでしょうか?
何か非効率的な気がします。

for (int h = 0; h < PAGE_HEIGHT; ++h) {
unsigned char buf[PAGE_WIDTH];
m_file.read((char*)buf, sizeof buf);
for (int w = 0, size = m_file.gcount(); w < size; ++w) {
printf("%02X ", buf[w]);
}
cout << endl;
}

739デフォルトの名無しさん2018/05/09(水) 17:38:59.81ID:J0gm0Ysv
スタックポインタをずらす量が変わるだけ
これによる時間はゼロと思って良い

740デフォルトの名無しさん2018/05/09(水) 17:44:16.81ID:bhGLBTeZ
>>739

そういうのを分かるようんなるにはどうすればいいのでしょうか?
C++の本だけ読んでいても分からないような気がします。

741デフォルトの名無しさん2018/05/09(水) 17:45:58.33ID:J0gm0Ysv
もしパフォーマンスが問題になるなら
printfをなんとかすべき

742デフォルトの名無しさん2018/05/09(水) 17:52:37.44ID:J0gm0Ysv
>>740
コードを書いたときに具体的にどんな処理が行われるか
を地道に学んで行くしかない

アセンブラを見てもいいし本で学んでも良いし
時間を測っても良い

C言語の方が簡単なのでC言語にある機能から

743デフォルトの名無しさん2018/05/09(水) 18:27:14.15ID:bhGLBTeZ
>>742
ありがとうございました。

744デフォルトの名無しさん2018/05/09(水) 19:10:47.36ID:WcTkBSWX
>>738
毎ループその buf が作られるかという質問について言えば
関数に入るときに確保された領域が毎ループ使い回されるだけ

745デフォルトの名無しさん2018/05/09(水) 19:12:26.96ID:bhGLBTeZ
>>744
ありがとうございます。
newした場合にはもちろん毎回別の領域が確保されるわけですよね。
文法だけからでは分からないことだと思うので、そのような部分を解説した本が
あればよいのですが。。。

746デフォルトの名無しさん2018/05/09(水) 19:21:16.91ID:sQgpoJ7Q
コンストラクターを起こすようなクラスならアレだけど
基本型はループの外においやらている可能性が高い

まぁ使ってるコンパイラの最適化次第というのはある

文法/規格だけで解決しない自由な部分は
実際に使ってるコンパイラの吐き出すコードをみるなり
実測して違いが出るか確認いてみたり……

初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな?

747デフォルトの名無しさん2018/05/09(水) 20:03:17.36ID:bhGLBTeZ
>>746

ありがとうございました。

748デフォルトの名無しさん2018/05/09(水) 20:03:43.32ID:tbbSaefy
>>745
C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。
CPUとメモリの動作とか簡単に学んでおくといい気がする。

スタックに収まらないような大きな領域をスタックに取ってはいけないとか
実践的に必要な知識でもあるんだよね。

749デフォルトの名無しさん2018/05/10(木) 00:46:37.51ID:hNESkqkP
>>748
個人的には、はじめて読むシリーズがコンパクトで良かった。
はじめて読む8086
はじめて読むPentium
はじめて読むMASM
はじめて読む486
486は結構ボリュームがある

750デフォルトの名無しさん2018/05/10(木) 12:36:43.93ID:dXwOta4y
クラスの練習に文字列クラスっぽいものを作ったんですが
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y

751デフォルトの名無しさん2018/05/10(木) 12:55:29.56ID:vDlJ/Ca2
>>750
>Mystr Mystr::operator=(Mystr &obj){

一般的にはこうする
Mystr & Mystr::operator=(Mystr &obj){

752デフォルトの名無しさん2018/05/10(木) 13:00:33.59ID:TqAsciuR
Mystr & Mystr::operator=(const Mystr &obj);

753デフォルトの名無しさん2018/05/10(木) 13:59:44.86ID:dXwOta4y
ありがとうございました
戻り値にも参照が使えることを知りませんでした

754デフォルトの名無しさん2018/05/10(木) 14:05:03.21ID:vDlJ/Ca2
>>753
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意

ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}

755 ◆QZaw55cn4c 2018/05/10(木) 17:59:19.87ID:XVn0zvPu
>>749
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…

756はちみつ餃子 ◆8X2XSCHEME 2018/05/10(木) 18:38:04.46ID:RiSXhiCD
アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。

>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486

757 ◆QZaw55cn4c 2018/05/10(木) 19:41:56.87ID:XVn0zvPu
>>756
これなんかも、動くかもしれません
http://takeda-toshiya.my.coocan.jp

758デフォルトの名無しさん2018/05/10(木) 20:45:54.69ID:CLWEept/
アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー

と言うことがわかれば十分な気がする

759デフォルトの名無しさん2018/05/11(金) 00:09:23.84ID:cA/jbwin
>>758
>>749
これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。
ただ、486以外は古本でしか手に入らなそうだけど。

760デフォルトの名無しさん2018/05/11(金) 07:04:43.76
薄い本ならコミケで売れや

761デフォルトの名無しさん2018/05/11(金) 13:11:04.97ID:Mluu9Rs0
アセンブラの前に

まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ

スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で

762デフォルトの名無しさん2018/05/11(金) 14:03:43.45ID:lM6VzEPt
>>760
http://zob.club/zob/2018/04/16/同人誌-advanced-assembler-386-上ノ巻/

763デフォルトの名無しさん2018/05/11(金) 15:32:04.47ID:L7FGnh/N
>>761
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う

セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる

764デフォルトの名無しさん2018/05/11(金) 16:43:05.52ID:ArEHxDOw
Z80からはじめよう。

765デフォルトの名無しさん2018/05/11(金) 17:23:03.14ID:fUD4+ayW
実用レベルのCで関数ローカル変数がどう実現されてるか、となると
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。

そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。

766はちみつ餃子 ◆8X2XSCHEME 2018/05/11(金) 17:39:10.37ID:e+Ei11A7
C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。

767デフォルトの名無しさん2018/05/11(金) 17:48:59.53ID:S57n19k4
Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ

768デフォルトの名無しさん2018/05/11(金) 19:45:01.89ID:CPfY1M+a
龍芯3号か

769 ◆QZaw55cn4c 2018/05/11(金) 20:48:44.74ID:/s88DeTW
マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども
仮想マシンの中間コードを触るのは疑問

770デフォルトの名無しさん2018/05/11(金) 20:52:01.78ID:Mluu9Rs0
PCはPCで面白いし、
8bitは8bitで面白い

771はちみつ餃子 ◆8X2XSCHEME 2018/05/11(金) 20:54:19.03ID:e+Ei11A7
AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。

772デフォルトの名無しさん2018/05/11(金) 20:56:49.04ID:2EGPeEG9
Donald Knuth の MMIX っていう言語は勉強するとためになりますか?

773デフォルトの名無しさん2018/05/12(土) 01:53:53.98ID:Cq1QtQw6
>>761
理解すると言っても何を勉強して理解するのか?
という話だと思ったんだけど。
アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。

774デフォルトの名無しさん2018/05/12(土) 04:35:38.94ID:F7LxnV/h
wikipedia の「コールスタック」の項に意外にしっかりした説明あるな
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。

775デフォルトの名無しさん2018/05/12(土) 14:17:18.55ID:CbmhA0Cx
メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。

環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw

776デフォルトの名無しさん2018/05/12(土) 14:20:15.63ID:CbmhA0Cx
>>772
ならないと思う。
クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。

777デフォルトの名無しさん2018/05/12(土) 15:41:16.04ID:9vavBtpK
RISC-Vの方がまだ有用な可能性が

778デフォルトの名無しさん2018/05/23(水) 19:24:44.84ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

AA6VB

779デフォルトの名無しさん2018/05/24(木) 10:45:43.84ID:cPlRxlDn
AA6VB

780 ◆QZaw55cn4c 2018/05/24(木) 20:42:22.15ID:dCOL2CYR
>>775
たしかに、そこをつく本を書けば売れるかもしれない
そんな本に書くべきことは、他に何があるだろうか?
・qsort() の説明
・アセンブリ言語とのリンク
・PEフォーマット
…etc

781はちみつ餃子 ◆8X2XSCHEME 2018/05/24(木) 21:49:22.52ID:jqqWnK8Z
>>775,780
江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。
今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、
当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。

782デフォルトの名無しさん2018/05/24(木) 22:04:43.75ID:hqF4m+Xg
シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発)

783デフォルトの名無しさん2018/05/24(木) 23:04:39.55ID:agu/wXZc
浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ

784デフォルトの名無しさん2018/05/25(金) 06:31:49.05ID:ZdzP9wu5
コンパイルとリンクとロードの話とか。

ソースファイルからオブジェクトファイルに変換したときに
どんな情報が残ってどんな情報が消えるか。
オブジェクトファイル群をリンクした段階でまだ確定せずに
実行時のロードで配置されるアドレスのこと、あたり。

新着レスの表示
レスを投稿する