[過去ログ]
【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1500329247/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
7: デフォルトの名無しさん [] 2017/07/21(金) 00:25:40.36 ID:cbDQlmdo ・見分け方 lvalueは、名前がある rvalueは、名前がない ・rvalueの特徴 名前がないということは使い捨ての一時的なオブジェクトだから、処理が終わったら捨てられる ・使い分けの理由 代入演算子(=)や、関数の戻り値に使う時や、vectorなどのコンテナに放り込む時には、 一旦オブジェクトがコピーされるが、rvalueだと分かっていたら、勝手にmoveしてくれるので処理が速い 特に、でかいデータを持った独自のクラスの場合にコピーよりmoveが速くなる この機能を使いたかったら、クラスのmoveコンストラクタとmove代入演算子(=)を定義しておくこと でも、それは面倒だろうから、ある条件を満たしたらコンパイラが勝手に作ってくれる ・条件 独自クラスに次のいずれの定義もしていないこと a) コピーコンストラクタ b) コピー代入演算子 c) デストラクタ C++歴1ヶ月の俺が答えてみるテスト http://mevius.5ch.net/test/read.cgi/tech/1500329247/7
8: デフォルトの名無しさん [] 2017/07/21(金) 00:50:30.03 ID:cbDQlmdo moveコンストラクタを作ったら気づくと思うが、処理内容は結局コピーコンストラクタと同じなわけ とどのつまり、ポインタをメンバーに持ったクラスを定義する時に有効なんだよ コピーコンストラクタ(lvalue)だと、コピー元は存在し続ける可能性があるから、 必ず1から全データを作り直して、ポインターのポイント先を新データにしないといけない でも、rvalueで捨ててもいいデータだと分かっていたら、捨てるデータを捨てずにそのまま使って ポインタのポイント先をその捨てるデータにすればよいから、楽で速いよねという話 http://mevius.5ch.net/test/read.cgi/tech/1500329247/8
9: デフォルトの名無しさん [sage] 2017/07/21(金) 00:56:26.30 ID:joLx1qFD 右辺値参照なら https://srad.jp/~taro-nishino/journal/507551/ が一番わかりやすい これ読んでわからなかったらまだ手を出すのが早すぎたと思って諦めたほうが良い 本を買っても無駄な出費になるだろう そして↑のページを見つけるのに検索してて出てきたのが↓ https://woorex.com/06_yahari/1994_01.html で、全然読んでないが、こういった文章に価値はないと思う ネットの文章のすべてに価値があるわけではないと思ったわ http://mevius.5ch.net/test/read.cgi/tech/1500329247/9
48: 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/07/22(土) 18:39:33.61 ID:WTRjQogU >>47 定理って言ってるんだから、定理だろ。 ベン図と真理値表で簡単に証明可能。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/48
50: 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/07/22(土) 18:48:30.61 ID:WTRjQogU 無限集合の場合は集合の内包的定義により、離散的な論理学に還元され、やはり成り立つ。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/50
133: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/07/29(土) 08:10:20.47 ID:HavpCAcr >>131 std::remove_copy_if を使うのが一番簡単な方法だと思う。 std::remove_copy_if(std::begin(map1), std::begin(map2), std::inserter(map2, std::end(map2)), [](decltype(map2)::value_type x) { return x.second < 0; }); みたいな感じ。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/133
143: デフォルトの名無しさん [sage] 2017/07/29(土) 10:19:10.90 ID:zJVnUUbX >>140 分かりにくいか? for(auto pair: map1){ if(pair.second < 0){ map2.insert(std::pair<int,int>(pair.first, pair.second); } } for(auto pair: map2){ map1.erase(pair.first); } http://mevius.5ch.net/test/read.cgi/tech/1500329247/143
180: デフォルトの名無しさん [] 2017/07/30(日) 17:25:43.33 ID:w5RmXCUD enum EMFType { MF_INT, // 符号付き整数 }; // いろいろなデータを1つの関数で表示します void MultiFunc(EMFType type, unsigned int data) { switch(type) { case MF_INT : cout << (int)data << endl; break; } } int main() { int a = -10; MultiFunc(MF_INT , a); return 0; } 実行結果 -10 unsigned int にマイナスの値を渡してるんですが、そのまま出力されます。 これが仕様だとすると、パラメーターにunsigned int を指定する意味はなんなんでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1500329247/180
296: デフォルトの名無しさん [sage] 2017/08/04(金) 14:31:21.93 ID:PHBV9/TP 呼び出し規約は実装依存ではないけどアーキテクチャ依存でもないよ そして、引数の受け渡しにレジスタをどう使うかというのは呼び出し規約と関係なく実装依存 さらに、引数はスタックに積まれるし、それはレジスタどうのこうのとは関係のない話 http://mevius.5ch.net/test/read.cgi/tech/1500329247/296
425: デフォルトの名無しさん [sage] 2017/08/14(月) 05:23:42.65 ID:P3rVXCaa class Point { public: Point() {} int x, y; }; std::vector<Point*> vec; vec..push_back(new Point()); こんな感じに作られたvectorの中のPointを解放するにはどうしたらいいでしょうか 以下のようなコードを考えて実行していたところ、free_base.cppというところで例外が発生しました 内容は「block Error reading register value.」です for (unsigned int i = 0; i < vec.size(); i++) { delete vec[i]; } http://mevius.5ch.net/test/read.cgi/tech/1500329247/425
613: デフォルトの名無しさん [sage] 2017/09/05(火) 23:58:54.60 ID:duOUbFWD >>612 char const*なりconst char*ならおk? http://mevius.5ch.net/test/read.cgi/tech/1500329247/613
641: デフォルトの名無しさん [sage] 2017/09/09(土) 13:55:13.28 ID:xEPuJyU1 低レベルな処理でポインタが便利と言われるのはなぜか 言葉で語るのは大変なのでコードで語ろう hoge *p = (hoge)nanika_no_memory_block; p->piyo = 100; これが出来る言語は、あまりない http://mevius.5ch.net/test/read.cgi/tech/1500329247/641
671: デフォルトの名無しさん [sage] 2017/09/16(土) 23:11:51.68 ID:F2zb0zkw C/C++的にはダメ http://mevius.5ch.net/test/read.cgi/tech/1500329247/671
700: デフォルトの名無しさん [sage] 2017/09/27(水) 12:36:06.37 ID:OnyIuiaa メモリがリニアでないバンク方式やセグメント方式の処理系を知らないとは無知だな。 far、near知らないとか最近勉強し始めたのだろう。 Cは低級言語。処理系依存を書く言語。 コンパイラが勝手に処理系に依存した定義をしろってこと。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/700
701: デフォルトの名無しさん [sage] 2017/09/27(水) 14:25:01.86 ID:hAn/VwKR nearだろうがfarもセグメント方式だろうが a-b+b=a+b-b=aになるけど ほとんどの環境で なんてことは知らないか http://mevius.5ch.net/test/read.cgi/tech/1500329247/701
703: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/09/27(水) 16:20:12.02 ID:yRzprl02 強力な最適化コンパイラはプログラマが未定義を踏んでいないことをあてにした最適化をすることがある。 「ほとんどの環境で大丈夫」なんていうのは現代では思い込みだよ。 全然大丈夫じゃない。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/703
717: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/09/27(水) 21:51:01.70 ID:yRzprl02 >>716 いいえ。 たとえば GCC は __builtin_offsetof を持っていて、 offsetof マクロはこれに展開されます。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/717
765: デフォルトの名無しさん [sage] 2017/09/30(土) 01:55:47.47 ID:+yH9ha/d ちょっと不可解な部分があったから質問させてくれ string型のデータをサーバに送信したくてOSSの関数に渡しているんだが、 データが一部壊れてしまう 問題のコードは、 string str = "{id:abc, ... , }" void* payload = (void*) str.c_str(); send(payload, str.length()); これをやると、先頭の5バイトがうまく入らない いくら考えても全然理由がわからず、意味のないことだと思いつつも以下のコードを書いてみたら何故かうまくいった string str = "{id:abc, ... , }" char* tmp = (char*)malloc(str.length() * sizeof(char) + 1); strcpy(tmp, str.c_str()); payload = (void*)tmp; send(payload, str.length()); 下のコードを使えばうまく動いてるから問題ないんだけど、上のコードがダメな理由がわからずすごく気持ち悪い。 何か上の例だとまずい部分があるのかな? 送信関数は以下 send(void* payload, size_t length); 環境はVC++ 2012 Windows 7 64bit ちなみに、同じコードを別環境(gcc 4.4.7 Cent OS 32bit)で動かすと、両方うまくいった http://mevius.5ch.net/test/read.cgi/tech/1500329247/765
771: 765 [sage] 2017/09/30(土) 10:38:13.12 ID:+yH9ha/d みんな回答ありがとう。 >>766 string型のメソッドで、文字列をconst char*にするやつ >>767,769 非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。 そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う >>770 OSSの関数がそう定義されてるから変換したんだ {id:abc. ... , } のうち先頭5文字の{id:aがおかしくなってるんだよね・・ Wiresharkでみると、バイトコード88ってなってたけどなんでそうなったのかが全然わかんない http://mevius.5ch.net/test/read.cgi/tech/1500329247/771
810: デフォルトの名無しさん [sage] 2017/10/10(火) 15:59:13.06 ID:3nxFazlM p==p_rgh + rho*gh; とあるのですが意味がわかりません。 p=p_rgh+rho*gh;であるべきと思うのですが、==と=が使い分けされているので タイプミスではなさそうです。どなたかよろしくお願いします。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/810
814: デフォルトの名無しさん [sage] 2017/10/10(火) 19:04:42.99 ID:3nxFazlM >>812 ご回答ありがとうございます。が、やはりわかりません。 たとえば、 if (p==p_rgh + rho*gh) { … } や、q=p==p_rgh + rho*gh;とかならわかるのですが、 … p==p_rgh + rho*gh; … と独立しているのでどんな処理をしているのか・・・ http://mevius.5ch.net/test/read.cgi/tech/1500329247/814
856: デフォルトの名無しさん [sage] 2017/10/14(土) 23:37:16.03 ID:q9IpA67V >>851-854 ということは、255サイズのリングバッファ作りたいときって unsigned char buffer[255] = {0}; unsigned char head=0, tail=0; unsigned char pop(){ if(head==255) head = 0; return buffer[++head]; } void push(unsigned char data){ if(tail==255) tail = 0; buffer[++tail]=data; } このサイズチェックのif文なくても大丈夫ってことですか? http://mevius.5ch.net/test/read.cgi/tech/1500329247/856
870: デフォルトの名無しさん [sage] 2017/10/16(月) 08:04:32.95 ID:iBTaJQF1 >char が9ビットとか16ビットの機械/コンパイラもあるんだよね。 え゛?まじで http://mevius.5ch.net/test/read.cgi/tech/1500329247/870
879: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/10/16(月) 21:19:32.17 ID:8llzdgRf >>870 ISO などでは 2008 年に 1 バイトは 8 ビットという定義を決めた。 http://diode.matrix.jp/LEGEND/BYTE.htm 1 バイトが 8 ビットではない (それなりに広く使われている) アーキテクチャが事実上消えたのは決め手のひとつだと思う。 C でこの定義を採用すると明記されているわけではないので、 C の言語仕様としては依然として処理系定義という扱いのはずだし、 何かの用途に特化したプロセッサでは変則的なものはいくらでもありうるんだけど、 自分で書くプログラムでそこまで想定することはまず無いわな。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/879
897: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/10/18(水) 02:21:26.88 ID:8euWiZGY >>895-896 「それなりに広く使われているアーキテクチャとしては」と限定して書いているのは、 そうでないアーキテクチャでは残っていることは承知しているという意味だよ。 自分ってのはまさに「私」のことなので実際気にする場面に遭遇したことがないし、 それをどうこう言われても俺に組込み系の仕事をして欲しいというのでもなけりゃ何の意味があるのかわからん。 http://mevius.5ch.net/test/read.cgi/tech/1500329247/897
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.450s*