C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part142
https://mevius.5ch.net/test/read.cgi/tech/1554124625/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/07/02(火) 18:42:45.57ID:B2rauTX7M
ないない
アセンブリ出力なんか見なくても
各コンストラクタに自分の素性を出力させるようにしてテストすりゃあわかる。
emplace_backはコンストラクタしか呼ばない
ムーブやコピーなどの余計なコンストラクタは呼ばれない。
v.emplace_back(A())
なんてアホなことやってたら呼ばれるけどなw
2019/07/02(火) 18:45:36.48ID:++9dcTkMd
てかplacement newさせるための機能だから
2019/07/02(火) 19:01:52.58ID:gnGzqTIu0
よくよく規格読むとemplace_backの要件のところでなぜかvectorに限って要素型にMoveInsertable要求してるな
(Table 88 - Optional sequence container operations)
vectorに限ってはID:z0GlqJ7U0の言う通りmoveするのかもしれんが何故だろう
アロケータ絡み?
2019/07/02(火) 19:20:16.00ID:++9dcTkMd
それ、領域の再確保で既存要素をmoveする必要があるからじゃね
2019/07/02(火) 19:24:28.67ID:gnGzqTIu0
そうかと思ったんだけどdequeにはこの要求ないんよね
2019/07/02(火) 19:40:57.73ID:++9dcTkMd
dequeの場合、最初と最後に限っては既存要素の移動が必要ないからだろう
2019/07/02(火) 21:48:42.92ID:w/Y51Ss20
>>401
size()がcapacity()を超えた時ごっそり移すから
2019/07/02(火) 22:19:13.91ID:hWBdgMuf0
>>391
実際はナマポによる問題よりもスマポの取り扱いのわからんバカによる間違った使い方のが多いけどな。
重要なのは言語による強制じゃなくて、教育だわ。
そこのコストを無駄にケチるバカ企業はどんな言語使っても無駄。
2019/07/02(火) 23:11:40.30ID:YKseWMPYa
なんかその間違えた使い方一覧とか見てみたくなるな
2019/07/03(水) 00:29:13.60ID:Odxsa8jS0
>>406
結局、生ポインタや生配列も必ず必要になるから、仕組みを理解せずに使えば
コンテナやスマートポインターの方こそが危険の原因になるのは容易に想像できる。
結局、実装の詳細を知らなければ危険なので、初心者向けでない。
2019/07/03(水) 01:01:33.73ID:Lb2Tc2mw0
>>408
生ポインタや生配列をコンテナやスマートポインターに置き換えて危険の原因になる例おしえて。
2019/07/03(水) 01:10:58.57ID:TLK5eLSla
>>408
俺も教えて欲しい。何が危険なの?
2019/07/03(水) 01:29:58.72ID:mX2Zy9Do0
こうやって具体例も出さずに古い知識と気分と思い込みでコンテナやスマポを意味なく禁止してナマポや生配列を強要する老害が一番危険
2019/07/03(水) 05:15:48.05ID:924EnmCA0
生ポ受け取って処理して返す関数の中で
受け取った生ポをユニポに入れてしまって
関数から抜けるときに消えちゃうバカとか?
2019/07/03(水) 06:37:42.42ID:TLK5eLSla
それは生ポの危険性やん
2019/07/03(水) 07:37:02.82ID:Odxsa8jS0
>>409
全部置き換えることは出来ないから。
2019/07/03(水) 07:54:35.14ID:mX2Zy9Do0
なんだキチガイか
2019/07/03(水) 07:58:15.56ID:giz72OluM
コンテナなりで確保して必要なときにポインタで渡すだけだろ
2019/07/03(水) 08:21:07.41ID:y5Z0HSqrM
結局このての老害が居座ってるのがこの言語の一番の欠点だわ
下手にC言語と互換性があるから頭の悪いナマポおじさんが初心者に間違った知識を広げていくという
2019/07/03(水) 08:45:56.67ID:Odxsa8jS0
>>379
vector で、TYPE型のオブジェクトを N 個収める場合、通常は、
2 * N * sizeof(TYPE) + (制御情報)
程度のバイト数が必要になる。一方、Cの生配列の場合、
N * sizeof(TYPE)
で済む。重要なのは、必要メモリに2倍もの開きがあるということ。
つまり、配列なら10MB で済むところが、vector だと20MB必要になる。
2019/07/03(水) 08:58:50.87ID:Odxsa8jS0
メモリ使用量という観点では、vectorよりもlistの方が優れる。
vectorは、メモリを2倍使用することで末尾追加の時間をO(1)に抑えているだけ。
固定長で済む場合はCの生配列を使うべき。
サイズを徐々に大きくしていくようなばあいは、vectorよりもlistの方が良い場合が
多い。ただし、listはランダムアクセスには向いてないが。
2019/07/03(水) 09:09:22.14ID:Odxsa8jS0
なお、TYPE のサイズが大きい場合に vectorを使うと、Core i7 でも Celeron 並み
にCPUキャッシュメモリが減ったかのようになり、せっかくのハイエンドなパソコンが
エントリーモデルのパソコン並みの速度になってしまうかも知れない。
2019/07/03(水) 09:13:08.57ID:+l3ADsTnM
生配列かvectorかlistかって論点古すぎ
今c++の複雑さはそういうとこじゃないから
他の言語含めてもうちょっと勉強しろ
2019/07/03(水) 09:15:31.03ID:y5Z0HSqrM
明らかにC++03時代の入門見て覚えた知識を頑張って披露してます状態だな
勉強足りなすぎ
2019/07/03(水) 09:16:24.83ID:TLK5eLSla
typeのサイズが大きい場合に生配列使うとそれはそれで問題にならん?
2019/07/03(水) 09:35:22.83ID:Odxsa8jS0
>>421 >>422
雑魚は黙っててくれ。レベルの低い人は自分がレベルが低いことに気が付かない。
このままだと日本のITは壊滅的なままだから。
2019/07/03(水) 09:52:43.97ID:+l3ADsTnM
>>424
はいはい雑魚雑魚
boostのstatic_vectorって調べてみな
生配列とvectorのいいとこどりのコンテナだ
eastlにも似たようなのあったはず
おれも大概おっさんでc++にネガティブな思いはある
だけどお前みたいな老害にはなりたくないな
2019/07/03(水) 10:01:00.52ID:Odxsa8jS0
>>425
static_vector みたいなアホみたいなものを持ち出して。
黙ってろよ馬鹿は。
想像力が足りない人が既にあるものをいくら勉強だけしても駄目なんだよ。
2019/07/03(水) 10:02:15.82ID:giz72OluM
約2倍使うのって追加するときに内部のサイズが足らん場合だけだろ
後別に遅くないがな
2019/07/03(水) 10:15:25.67ID:4T2xKCYX0
基礎をすっとばすのが良くないというのは同意だわ
C++はスクリプト言語の代わりにはなれない
2019/07/03(水) 10:41:14.59ID:N/cOPmK/d
>>418
その*2はどこから出てきたんだ?
生で10MBでサイズ既知なら、vectorでも10MB+固定サイズ制御情報にしかならんだろ
2019/07/03(水) 11:06:00.23ID:PfdnSFjeM
そんな細けーこと気にするならデフォのnewやmalloc使ってたら笑うぞ
2019/07/03(水) 11:28:18.95ID:Odxsa8jS0
>>429
vectorは構造上はリンクリストではなく、Cの生配列と全く同じ形式で
要素を単純な配列として持っているが、最初に最大要素数を指定しなくても
後から動的に要素数を増やす機能も持っている。この機能の実現の際、もし、
今入っている要素数とぴったり同じだけの個数が入る配列でデータを持っているだけだと、
1個ずつ末尾追加したときに、毎回、今までと同じ大きさの新しい配列を new し、
古い配列のN個の要素を全て新しい配列にコピーする動作をしなくてはならず
とても時間がかかってしまう。それを防ぐために、原則的には 今入っている
要素の2倍の配列を内部的に持つことにされている。そうすることによって、
要素数が2倍に到達するまでは、末尾追加しても今言った「new してから全てコピーする動作」
をしなくて済むようになる。そのために、必要メモリが生配列の二倍必要になっているらしい。
2019/07/03(水) 11:36:58.84ID:uVFkIemlM
最悪の場合を言ってるのだろう
平均で見なきゃ意味ない
そんなこと言ったらクイックソートだって
2019/07/03(水) 11:40:32.67ID:uVFkIemlM
そもそも好きに使って経験を積みゃいいんだし手法を統一する必要もない
2019/07/03(水) 11:48:52.78ID:Odxsa8jS0
>>432
最悪で2倍、平均だと 1.5倍。
2019/07/03(水) 11:51:28.69ID:uVFkIemlM
なら許容範囲だね!!よかったよかった
2019/07/03(水) 11:51:35.55ID:oDCSMM9SM
shrink_to_fitでも使えや
2019/07/03(水) 11:53:21.22ID:Odxsa8jS0
>>435
CPUの内部キャッシュは、ハイエンド機種でも8MB程度しかないので、
むやみにメモリを使った場合の速度低下は著しい。
2019/07/03(水) 11:58:54.95ID:uVFkIemlM
用途要求仕様要件目的予算を特定せずに何を判断せよと
2019/07/03(水) 12:02:59.10ID:mX2Zy9Do0
#include <iostream>
#include <vector>
using namespace std;
int main() {
 std::vector<int> v(10);
 cout << v.capacity();
 return 0;
}

>>431
どこのコンパイラが20や15表示するの?教えてよ
俺の手元のGCCとclangとVCとiccは当然だけど10だったよ
そんなサイズ伸縮やreserveもする前から手前勝手に1.5倍やら2倍やら確保するコンパイラがあるなんて怖いからさ
お前の妄想や思い込みじゃないなら当然答えられるよね?そんな長文書くほど自信満々なら知らないわけないよね?
教えてよ
2019/07/03(水) 12:08:29.19ID:Odxsa8jS0
>>439
仮に要素数と内部テーブルのサイズが原則同じなのであれば、>>431
で書いたように末尾追加がかなり遅くなる。その場合、std::vector
とstd::list では末尾追加の速度が劇的に違うことになる。
2019/07/03(水) 12:10:06.32ID:oDCSMM9SM
末尾追加したいのかCのように固定長で使いたいのかはっきりせぇや
どう転んでも文句言いやがってw
2019/07/03(水) 12:10:28.85ID:N/cOPmK/d
生配列と比較するならサイズ既知なのだから、サイズ指定して初期化、もしくはreserveするのは当然だろ

push_back使うなら、生配列の側も現在の実サイズを別変数で管理しないと公平でない
2019/07/03(水) 12:12:09.83ID:Odxsa8jS0
>>442
区別することが大切だといってるんだよ。
2019/07/03(水) 12:12:52.89ID:oDCSMM9SM
キャッシュなんてキャッシュラインサイズごとに読み込むのだから
使いもしないvectorで確保した領域全部読むわけちゃうぞwwww
vectorか生ポかなんて低次元な話ではなくメモリアライメントまで気にしとけと。
だからごちゃごちゃ言うやつはデフォのmallocなんか使ってないよなと確認したのにwww
2019/07/03(水) 12:13:13.85ID:uVFkIemlM
「トレードオフを理解はするが、許せない」
こういうことか?
2019/07/03(水) 12:13:21.22ID:mX2Zy9Do0
>>440
あっはい追加時の話はどうでもいいです
追加量が読めてるならreserveなり最初に大きめに構築するなりするだけだし、読めてないならそれ必要なコストですよね?
私が聞きたいのはreserveや要素追加も伴わずに勝手に常に2倍で確保するというコンパイラorライブラリの具体的な情報です
質問に答えてください
2019/07/03(水) 12:14:08.32ID:oDCSMM9SM
>>443
固定長でとったら伸ばせないと文句いい
伸ばせるようにしてたらメモリ無駄と言い
文句言いたいだけやろwww
2019/07/03(水) 12:14:30.07ID:Odxsa8jS0
>>441
そういうことじゃなくて、新しく追加された機能を何も考えずにそのまま使って
C#との速度比較に用いてC++がC#に負けたと主張するQiitaの記事が「C# 速度」と
いうGoogle検索で上位に来るから困るんだよ。
2019/07/03(水) 12:15:34.63ID:Odxsa8jS0
ここはアホが多すぎ。
2019/07/03(水) 12:16:03.22ID:oDCSMM9SM
>>448
なんでそういう低次元な前提で機能自体を否定しにかかってんだよwwww
そもそも無駄だから生ポ使えと主張してたくせに曲げてくんなよwww
2019/07/03(水) 12:16:29.07ID:oDCSMM9SM
>>449
敗北宣言なら素直になれよwww
2019/07/03(水) 12:17:18.98ID:N/cOPmK/d
この展開だと、知識もスキルも足りていない奴が、誤解でvector使えないといっているだけにしか見えないな
2019/07/03(水) 12:18:06.65ID:mX2Zy9Do0
>>448
C#??Qiita??C++98からあるvectorが「新しい機能」?????
キチガイのフリしてるんじゃないなら逃げずに>>439>>446に答えろ。知らんなら知らんと正直に言え
答えないならフリじゃないとみなす
2019/07/03(水) 12:18:33.35ID:Odxsa8jS0
日本のITが駄目な理由がここに全て現れている。
その上、自分達がレベルが高いと思っているのがまた痛い。
日本はもう二度と浮上しないな。
2019/07/03(水) 12:20:42.38ID:mX2Zy9Do0
>>454
OK、知らないってことね。もしくはキチガイごっこ続けるわけね
>>431みたいなことドヤ顔でほざいて、根拠求められれば逃げ回って結局示せなくて
お前とコードレビューしてる同僚はさぞ仕事が辛いだろうな
同情するわ
2019/07/03(水) 12:21:17.25ID:N/cOPmK/d
自ら体現してくれているんかな
2019/07/03(水) 12:22:21.83ID:oDCSMM9SM
>>454
逃げる前にお願い
効率悪いとかそういう話ではなく
一番最初に主張していた
スマポとコンテナの方が生ポより危険
をちゃんと言ってからにしてよ。
危険性の話から効率の話になってc#とか言い出して
ひたすらトーンダウンなんだけどwww
2019/07/03(水) 12:24:17.58ID:mX2Zy9Do0
やめたれよ
vector2倍コンパイラの名前をずばり答える能力すらない人間にその抽象的な質問は難しすぎる
2019/07/03(水) 12:26:05.69ID:+Us18YV60
駄目なところは用途によって変えるべきなのに包括的に物事を判断することしかしないから
vectorが確保するcapacity程度でも気にすべき環境なら当然気にするし、そうじゃないなら気にしなきゃいい
気にしなくて良いケースでもとにかく重箱の隅をつついて難癖つけるような輩が居る
サービス利用者からみて大差無けりゃどうでもいいのに変なところにこだわり持つからサービスが生まれない
2019/07/03(水) 12:44:03.73ID:gUarAEEJp
なんや今日はいろんなスレでキチガイ多いなと思ってID見たら
VS2019スレで妄言垂れてたのと同じキチガイじゃねえかw
2019/07/03(水) 12:45:35.43ID:mX2Zy9Do0
このボケ老人よそでも暴れてたのか
くわばらくわばら
2019/07/03(水) 12:51:50.17ID:oDCSMM9SM
そもそもmallocでも管理領域あるしな。
さもなくばfreeするときサイズわからんようなるからwww
2019/07/03(水) 12:56:09.64ID:XRQdtmsk0
2018年度の流行語大賞をとった彼じゃないの

C言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/37

37 名前:デフォルトの名無しさん (ワッチョイ f94f-yqSl)[sage] 投稿日:2018/09/22(土) 01:42:06.64 ID:16ZpsTnK0
>>36
(略)

> void show_all(void)

なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?

(略)
2019/07/03(水) 14:05:50.55ID:zZwRICR4a
まあ今のC++で生配列と生ポインタ使う理由はゼロだわな
2019/07/03(水) 14:52:53.74ID:4T2xKCYX0
vectorに対する難癖が叩かれる割に
>>464みたいな井の中の蛙が叩かれないのは理解できんけどな
まぁこんなこと言ったらまたファビョる奴が出てくるんだろうけど
2019/07/03(水) 14:53:02.50ID:eEnZmm5I0
C互換APIは生配列と生ポインタで受け渡しなので完全排除は不可能。
2019/07/03(水) 15:25:33.02ID:uVFkIemlM
狭いローカルスコープ内にある
int arr[3] をわざわざ std::array<int, 3> にしようとも思わないけどな
2019/07/03(水) 15:40:50.78ID:mX2Zy9Do0
なるべくスマポとarrayに変えていくべきだというのも、置き換えきれない所があるのも両方とも正しい
どっちかの極端に走るとさっきの老害みたいになる
2019/07/03(水) 16:44:21.55ID:Odxsa8jS0
>>468
あなたの脳内では、
「C言語は危険なので成るべくBASIC言語に置き換えていくべき」
なんだよね。
2019/07/03(水) 16:59:26.35ID:mX2Zy9Do0
>>469
キチガイさんこんばんは
さっさと>>446に答えるか死ぬかどっちか選んでね
2019/07/03(水) 17:05:49.68ID:Odxsa8jS0
無能の意見 ---> 「自転車は危険なので全員三輪車に乗るべき」
2019/07/03(水) 17:10:10.75ID:mX2Zy9Do0
>>471
有能なアナタなはもちろん自分で披露した知見の裏付けくらい当然に示せますよね?
>>446に答えるか無能を認めるかさっさと選べよ
2019/07/03(水) 17:24:49.04ID:Odxsa8jS0
昔、「BASIC言語は誰でも使える」と言われていたが、STLのコンテナや
スマポを使ったプログラムは、絶対にそれだけを使って、かつ、効率を
考えなければそれに匹敵するくらい簡単。

でもそれでは駄目な領域が有る。
2019/07/03(水) 17:28:06.79ID:+Us18YV60
何の主張で議論してんのかさっぱりわからん
マウント取りたいだけ大会みたい
2019/07/03(水) 17:28:59.92ID:mX2Zy9Do0
>>473
その長文書く暇で>>446答えられたでしょ
早く答えろよ
2019/07/03(水) 17:31:39.19ID:oDCSMM9SM
>>473
話が変わってるぞ
スマポとコンテナが生ポより危険だと言っだろ
それを示せと
2019/07/03(水) 17:33:01.94ID:Kb9ohuF+d
効率も大部分の応用分野では悪くないんだな
2019/07/03(水) 17:34:35.23ID:giz72OluM
用途にあったコンテナなら効率いいだろ
2019/07/03(水) 17:44:37.37ID:mX2Zy9Do0
>>478
それがどうやらvectorは生配列の2倍の容量を食うから効率悪いんだってさ(>>431)
GCCclangVCiccでは違うけど、そんなコンパイラが本当にあったら大変だからどんな環境だとそうなるのか気になるよね
というわけで>>446に今すぐ答えてねID:Odxsa8jS0さん
さっさとしろよグズ
2019/07/03(水) 17:54:58.55ID:Odxsa8jS0
この板のような匿名性の過疎スレはレベルの低い連中の意見が多数派になりやすい。
つまり少数精鋭の完全な逆。
2019/07/03(水) 17:55:47.12ID:mX2Zy9Do0
>>480
レベルの高い>>446への回答をよろしくお願いします
いつまでも逃げ回ってんじゃねえぞ卑怯者
2019/07/03(水) 17:55:50.16ID:Kb9ohuF+d
お願いだからレベルの高さを見せてくれよ
2019/07/03(水) 17:57:20.12ID:giz72OluM
アホだから要素追加時のとごっちゃになってんだろう
要素0でpush_backしたらキャパ2以上になるのはそれなりにあるんかな
2019/07/03(水) 17:58:11.80ID:Odxsa8jS0
馬鹿にはいくら言っても本質が理解できない。ちゃんと答えても的外れな
観点で何か言って来る。質問自体が馬鹿だから答えてもしょうがない。
2019/07/03(水) 17:58:59.95ID:Odxsa8jS0
いっとくが、むしろ俺は天才といわれてる。天才の言うことが理解できない
凡人たちだ。ここの人は。
2019/07/03(水) 17:59:33.93ID:Kb9ohuF+d
確かにこの流れを見た感想そのものだがw
2019/07/03(水) 18:00:04.76ID:uMmlAeoj0
変なの住み着いちゃったな
2019/07/03(水) 18:01:34.34ID:Odxsa8jS0
雑魚は黙っとけ。馬鹿どもめが。
2019/07/03(水) 18:01:56.66ID:mX2Zy9Do0
>>485
凡人なのでvector2倍コンパイラの正体がわからないと不安でたまりません
天才の閃きで>>446に答えてください
もしくは自分を天才だと思い込んでる狂人だと認めてください
2019/07/03(水) 18:03:42.55ID:mX2Zy9Do0
>>489
自分で行ったことへの責任すら取れないアンタが客観的に見てこのスレで一番の雑魚だよ
雑魚扱いが嫌なら>>446に答えろ
答えないなら言いっぱなしの無責任で卑怯なクソ雑魚として永遠に軽蔑する
2019/07/03(水) 18:04:02.74ID:mX2Zy9Do0
>>490>>488へのレスな
2019/07/03(水) 18:04:04.67ID:lDDJeJVH0
>>483
一般的には、capacity()サイズを倍々にしていく実装が多いんじゃないかな?
2019/07/03(水) 18:04:18.16ID:Odxsa8jS0
>>489
通常は2倍と聞いている。恐らく、上に上がっている例だと、何らかの
事情で2倍になっていない特殊な結果が出たのだと思われる。
2019/07/03(水) 18:06:23.80ID:Odxsa8jS0
凡人は本質を理解できないからソースを見たり実験しないと分からないんだろう。
天才はソースも実験もしないでも結論が分かる。数学と同じだ。
実験して結果が違っていたとしてもそれは例外だと断定できる。
なぜなら、絶対にそういう実装で無ければ成らないことが天才には分かるからだ。

凡人の反論は受け付けない。これは絶対だ。実験とか関係ない。
2019/07/03(水) 18:09:13.98ID:mX2Zy9Do0
そっか
天才様の書いたプログラムは必ず天才様が思ったとおりに動くに決まってるから、動かしてテストもしないんだね
怖すぎるから絶対に本番用コードに近寄らないでね天才様
2019/07/03(水) 18:11:21.64ID:Odxsa8jS0
>>495
関係ない。数学とはそういうものだ。テストなんか無くても結果が分かる。
絶対に正しいということが分かるんだ。それが凡才と天才の違いだ。
ここには秀才レベルもいない。
2019/07/03(水) 18:11:41.02ID:uMmlAeoj0
適当に書いたことに予想外に食いつかれて、
答えられなくなったからネタに走ってごまかそうとしてるだけだろ
2019/07/03(水) 18:13:16.43ID:qqPAz+Nsd
「便所の落書きに天才現る (2)」
(c) 蟻人間 2019年7月発行.
無断転載を禁ず.
2019/07/03(水) 18:13:49.02ID:giz72OluM
>>492
倍々なのか
変な人が勘違いしてたのはそのへんか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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