C++相談室 part122 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2016/01/23(土) 23:06:15.32ID:HdItgJjmただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part121
http://peace.2ch.net/test/read.cgi/tech/1449240881/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.97【環境依存OK】
http://peace.2ch.net/test/read.cgi/tech/1439849418/
次期規格C++1zはこちら
C++14/C++1z 20
http://peace.2ch.net/test/read.cgi/tech/1410382924/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
0232デフォルトの名無しさん
2016/01/29(金) 23:52:06.13ID:Hpd/92hjいや意味が全く無いわけではない
std::vector::push_back()呼び出し時点での余分な領域確保とか、速度低下が最小化される
0233デフォルトの名無しさん
2016/01/30(土) 00:09:33.50ID:VhIzDspW230 じゃないけど、 >227 の reserve() で「速度低下が最小化される」なんてことは無いでしょ。
単発なら変わらないだろうし、ループした場合は reserve() しないほうが速いし。
0234デフォルトの名無しさん
2016/01/30(土) 00:17:51.94ID:lYkNZO2mないない
push_backで領域が足りなければreserve相当のことは自動的にされるし
まあないだろうがstd::vectorの実装によってはsize()+1のreserveが速度に悪影響与えることだってあり得るんじゃないかな
>>227のもう一つ痛いところはreserveさえしておけばpush_backでの例外が無いと決めつけてるところ
そんな規定はないだろ?
0235デフォルトの名無しさん
2016/01/30(土) 00:21:53.24ID:nKxSIfYZ> push_backでの例外が無いと決めつけてるところ
というより、それを一切考慮してない希ガスw
そいつ一人だけ問題の本質に到達できていない
bad_allocが投げられるのは一緒ってことも知らないんだろうし
0236デフォルトの名無しさん
2016/01/30(土) 00:55:16.18ID:GfziY5060237デフォルトの名無しさん
2016/01/30(土) 03:14:53.57ID:HpDJFp9+漏れは慎重に「std::vector::push_back()呼び出し時点での」と限定して書いたで?
0238デフォルトの名無しさん
2016/01/30(土) 05:43:02.21ID:VhIzDspWん?だから何?
push_back() 関数内での領域確保・実行時間を減らして、それらを push_back() の
直前の処理に移動することに何か意味があるとでもいうの?それはどんな場合にうれしいの?
0239デフォルトの名無しさん
2016/01/30(土) 05:59:47.15ID:GfziY506「〜される」
B「そんなことは ない」
A「そんなこと ある だろ」
B「だから何?〜だと何かいいことあるのか?」
>>232の2つの文のどちらについて話をしているのかの認識がずれていることに気付かない低能どもの会話は滑稽だな
0240デフォルトの名無しさん
2016/01/30(土) 06:17:44.28ID:GfziY506メモリ確保のnew/deleteは禁止にしてスマポとコンテナーだけ使っとけ
ついでに馬鹿はshared_ptrも使用禁止にしといた方が安全
0241デフォルトの名無しさん
2016/01/30(土) 11:02:01.65ID:u8r8Wxi4> v.push_back(new Fuck);
やっぱり馬鹿にC++は無理だなw
push_backの直前で+1サイズのreserveとかw
http://www.cplusplus.com/reference/vector/vector/reserve/
ここのExampleみてお勉強しなおしたら?
例外投げるのも書いてくれるから学んどけよ
0242デフォルトの名無しさん
2016/01/30(土) 11:46:11.52ID:GfziY506push_backはcapacityに余裕が有るときに再アロケーションしないことは保証されているが
例外を出さない保証は23.3.6.5から読みとれないな
やはり馬鹿にはスマポを強制したほうがいい
0243デフォルトの名無しさん
2016/01/30(土) 13:13:55.69ID:VK1fBsAoreserve()とpush_back()のどちらで例外が発生するかという文脈において、
>>227のreserve()がpush_back()の直前行であるという解釈は一体…
まあv.reserve(v.size() + n);ならともかく、v.reserve(v.size() + 1);だったから気持ちはわからんでもない
0244デフォルトの名無しさん
2016/01/30(土) 14:18:45.97ID:GfziY506何を言ってるんだお前は
0245デフォルトの名無しさん
2016/01/30(土) 15:00:28.25ID:9j1RlcoP0246デフォルトの名無しさん
2016/01/30(土) 16:17:33.41ID:GfziY506挿入前に拡張すると(要素のコンストラクター以外では)例外が出ないという保証はある?
0247デフォルトの名無しさん
2016/01/30(土) 16:22:43.98ID:AurOqJPwCとなら関係あるかも知れないが、プログラミング言語でないC。
もちろん俺の読み違いかもしれない。
0248デフォルトの名無しさん
2016/01/30(土) 16:27:26.60ID:7MlWNObS☆一行のとき
v.push_back(foo); // ここで例外
☆二行のとき
v.reserve(v.size() + 1); // ここで例外
v.push_back(foo);
こうなるだけじゃないの?
新たな連続した一本のメモリが確保できないと例外なんだから
0249デフォルトの名無しさん
2016/01/30(土) 16:35:52.43ID:lYkNZO2m規格を読んだ限り保証はされてないね
現実に存在する実装ではreserve済みであれば生ポのpush_backじゃ例外発生しないだろうけどね
そんなことはアテにしちゃいけない
0250デフォルトの名無しさん
2016/02/01(月) 01:01:58.63ID:CuJD672cnewを一旦別の変数で受けるしかないでしょ
hoge h;
h = new hoge;
vec.push_back(h);
が正解。
0251デフォルトの名無しさん
2016/02/01(月) 01:58:17.63ID:fnCrDph6バカはnewを書くな!
0252デフォルトの名無しさん
2016/02/01(月) 02:09:31.02ID:CuJD672cあんたバカバカ言ってるけどnewを使うかmake_sharedを使うかはこの問題の本質じゃないから。
馬鹿じゃないならわかるよね?
0253デフォルトの名無しさん
2016/02/01(月) 02:22:38.94ID:dRJvSEmLvec.push_back( new t() )
の場合、newで例外が発生したらpush_backは実行しないんだから関係ないと思うんだが
push_back呼ぶ前の、スタックに引数を積む段階で例外が発生するわけだから
push_backは呼ばれもしないし、全く関係ないと思うんだが
0254デフォルトの名無しさん
2016/02/01(月) 02:25:49.77ID:fnCrDph6あなたが問題の本質を理解してると思えないが?
newを変数で受けたってなにも変わりはしないよ
てか、まずはhoge* hにしてから言ってくれない?
0255デフォルトの名無しさん
2016/02/01(月) 05:14:31.96ID:yDMVnQCY0256デフォルトの名無しさん
2016/02/01(月) 06:43:17.15ID:JTo/Q0C3C++の教科書にある間違ったコードのテンプレのような糞コードを真顔で言い出す低能を見ると
やはり馬鹿にはスマポとしか言いようがない
0257デフォルトの名無しさん
2016/02/01(月) 17:11:12.73ID:Ev74Df4FJavaでは普通、ネイティブリソースはRAIIで開放するぞ
0258デフォルトの名無しさん
2016/02/01(月) 17:14:07.57ID:/UrjTotH0259デフォルトの名無しさん
2016/02/01(月) 17:59:52.82ID:fnCrDph60260デフォルトの名無しさん
2016/02/01(月) 18:03:33.95ID:JTo/Q0C3>>259のオツムがフットーしてしまうのも致し方ない
0261デフォルトの名無しさん
2016/02/01(月) 19:47:56.26ID:FCPkKuCGnewしたままdeleteしねぇ糞ソース大量生成しやがる
0262デフォルトの名無しさん
2016/02/01(月) 20:09:02.04ID:qjT3Q9+KJava厨は犬派で、C++厨は猫派だからな
newと鳴いたら、deleteるからな
0263デフォルトの名無しさん
2016/02/01(月) 20:24:37.67ID:ZBzDFClpこういう喩え話って、短い文章中に多くの情報が込められてるものだが。
無粋を承知でお願いします。解説してください。
0264デフォルトの名無しさん
2016/02/01(月) 20:42:15.43ID:aUqGS129Java 厨に生ポなんて使わせるお前が狂ってる
0265デフォルトの名無しさん
2016/02/01(月) 20:46:33.11ID:qjT3Q9+K深い意味は無いよ
C/C++やるときはnewしたらdeleteせよ!って鉄則でしょ
ニャー(new)と鳴いたら、必ずデレてる(deleteる)からC++厨は猫派
単なるダジャレだよw
0266デフォルトの名無しさん
2016/02/01(月) 20:51:56.51ID:JTo/Q0C3低能のお前にはわからないかも知れないが
そんなことはない
0267デフォルトの名無しさん
2016/02/01(月) 21:00:17.78ID:fOHJkiXU自分が人間より上だと思ってるのでデレることはない
0268デフォルトの名無しさん
2016/02/01(月) 21:32:50.64ID:JTo/Q0C3ジャバ厨とレッテルを貼るのではなく、たまたまソイツが低能だからということに気付くべき
Javaでもリソース開放は行うし、C++スレにも>>250,>>252,>>253のようなメモリも開放できない奴もいる
0269デフォルトの名無しさん
2016/02/01(月) 21:42:26.29ID:BsHDgmsO0270デフォルトの名無しさん
2016/02/01(月) 22:07:54.53ID:wHu9vKIt低脳な Java 使いだから Java 厨ってラベル貼られてることに気づくべき
0271デフォルトの名無しさん
2016/02/01(月) 22:57:12.27ID:47CQ9v48ツリー構造で子が親へ参照を持つときに使ったことがあるな
相互参照するけど、親の寿命管理が必要が無いのでshared/weak_ptrが不要なケース
↓こんな感じ
class tree_view
{
tree_view *parent;
vector<unique_ptr<tree_view>> children;
};
0272デフォルトの名無しさん
2016/02/01(月) 23:10:37.79ID:BsHDgmsOdeleteの出番なしか
0273デフォルトの名無しさん
2016/02/01(月) 23:55:10.43ID:CuJD672cだったら模範解答貼ってみせろよクズ
0274デフォルトの名無しさん
2016/02/02(火) 00:06:14.39ID:ygGmQV700275デフォルトの名無しさん
2016/02/02(火) 00:14:57.63ID:oBfAWjKR子を作り管理するのは親ですか?
0276デフォルトの名無しさん
2016/02/02(火) 00:50:11.96ID:AUeQZlYi0277デフォルトの名無しさん
2016/02/02(火) 00:59:22.35ID:AUeQZlYiこう書いとかないと馬鹿には使えないが口癖のボットに絡まれそうだし一応書いとくわ
0278デフォルトの名無しさん
2016/02/02(火) 01:25:45.50ID:x5amnXbsへえJavaにもRAIIの概念なんてあったんだ
Javaな現場になんてもう何年も関わってないんで知らんかったわ
0279デフォルトの名無しさん
2016/02/02(火) 01:37:28.22ID:r5dd6eSW0280デフォルトの名無しさん
2016/02/02(火) 03:58:43.22ID:uTTEQY4N例だろうとポインタ間違えた上に
今時newしてvectorにpush_backしちゃうようなコード書いて
その上逆ギレしちゃう奴は正直ダメだと思う
0281デフォルトの名無しさん
2016/02/02(火) 06:45:21.02ID:5quLb8tihttp://ideone.com/QRZXDk
上の21行目の再解釈キャストで型変換してるところってVCでは意図したとおりに動いたのですが、
これって他の環境でも大丈夫ですか?
0282デフォルトの名無しさん
2016/02/02(火) 07:52:12.29ID:Vw/b/5l0おしえてください。
&a[0]はaの要素の1番目の番地で&aはaの1番目の要素を
指し示すアドレスのアドレスの気がするからです。
0283デフォルトの名無しさん
2016/02/02(火) 07:59:56.34ID:N9T32bdW(ポインタ変数のアドレスならある)
0284デフォルトの名無しさん
2016/02/02(火) 09:42:40.95ID:LvBWX7cXstd::vector<int> v(???);
でメモリの確保に失敗した場合の動作はどうなりますか
0285デフォルトの名無しさん
2016/02/02(火) 11:14:27.48ID:NoB4axe7"自動車"クラスが提供する個々の機能(例えばアクセルやブレーキ)は、
サブクラスが提供(例えばアクセルはエンジンクラスに定義)して、
"自動車"クラスは特に関与しないものとします。
この前提において"自動車"クラスを定義する場合、"自動車"クラスは
サブクラスを継承するかたちで定義したほうが良いでしょうか?
それとも、自動車クラスが個々のサブクラスのインスタンスを保持して
メソッドをラップしたほうが良いでしょうか?
0286デフォルトの名無しさん
2016/02/02(火) 11:22:39.18ID:ygGmQV70継承を確信できるところでのダウンキャストは static_cast の出番。 5.2.9 [expr.static.cast] p2
reinterpret_cast で作った結果に移植性があるのはごく一部だけ。 5.2.10 [expr.reinterpret.cast]
0287デフォルトの名無しさん
2016/02/02(火) 11:22:52.91ID:MIlHcyxr0288デフォルトの名無しさん
2016/02/02(火) 11:23:10.07ID:ygGmQV70いいかげんな教材には a が「配列先頭要素へのポインタである」などと
書いてあるかもしれないが、実際には「配列」であり一部の例外を除いて
「配列先頭要素へのポインタに暗黙変換される」ということになっている。
& 演算子は例外のひとつで、 &a で配列そのものへのポインタが得られる。
4 [conv] p8
0289デフォルトの名無しさん
2016/02/02(火) 11:23:22.64ID:ygGmQV70非標準の動作なので、まずコンパイラのマニュアルを調べる。
書いてなければ、どうせ移植性は期待できないので実験でもいいかもしれない。
0290デフォルトの名無しさん
2016/02/02(火) 11:24:45.55ID:ygGmQV70https://www.google.co.jp/search?q=is-a+has-a
0291デフォルトの名無しさん
2016/02/02(火) 11:30:10.28ID:NTv/QStd当然後者。
現実の関係を模倣するのが普通。
一点、ラップってのをどういう意図で使っているのかが気になる。
個々の部品を組み合わせて、車としての機能を提供すると考えてね。
部品の機能をスルーするだけのラッパーはあまり出ないはず。
0292285
2016/02/02(火) 11:53:42.81ID:NoB4axe7継承と包含の関係を理解してませんでした。
ちなみに”サブクラス”という言葉の使い方も誤解してたみたいです(^^;
>>291
>ラップってのをどういう意図で使っている
部品の機能をスルーするだけのラッパーという意味でした (^^;
その辺も含めてもう少し設計を見直したいと思います。
0293デフォルトの名無しさん
2016/02/02(火) 13:09:09.90ID:ZM61xwKS0294デフォルトの名無しさん
2016/02/02(火) 13:26:24.18ID:7f7wf/mW俺の環境だと、色々省略すれば
std::vector : protected std::_Vector_base {
vector(size_type __n, const allocator_type& __a = allocator_type()) : _Vector_base(__n, __a) { _M_default_initialize(__n); }
};
std::_Vector_base {
_Vector_base(size_t __n, const allocator_type& __a) { _M_create_storage(__n); }
};
となって、最終的に__gnu_cxx::__alloc_traits<_Alloc>::rebind<_Tp>::other::allocate() defined at ext/new_allocator.hが呼び出されて
pointer allocate(size_type __n, const void* = 0) {
if (__n > this->max_size()) std::__throw_bad_alloc();
return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
}
が走る。つまり、俺の環境だと、std::vector<int> v(100);すると::operator new(std::size_t)が呼び出されて、例外機構を殺して確保も失敗するなら投げられたbad_alloc例外を処理できずにコケる。
これを書き換えてoperator new(__n * sizeof(_Tp), std::nothrow);とするならallocateはメモリを確保できない時にnullptrを返す。すると次に_M_default_initializeが走って、
最終的にplacement newが走って、thisをデレファレンスした瞬間にセグメンテーションフォールトでコケる。
要するに、例外が発生して安全に停止する前提でライブラリが組まれてるから、例外機能をオフにしたら不安定な動作になる。
例外機能をオフにしようが何しようがthrow自体は出来るので、きちんとcatchしましょうって話に落ち着くかと。
0295デフォルトの名無しさん
2016/02/02(火) 14:09:39.60ID:oBfAWjKR知らなかった・・・
0296デフォルトの名無しさん
2016/02/02(火) 15:14:11.42ID:Ycdr5jOx0297デフォルトの名無しさん
2016/02/02(火) 15:35:32.57ID:TPiwOAfkなんか気持ち悪いな
0298デフォルトの名無しさん
2016/02/02(火) 15:59:38.85ID:5quLb8ti回答ありがとうございます。
protectedで継承しているのでstatic_castは無効なのです。
これは移植性ないとみるべきなんでしょうか。
強引にCスタイルキャストでごまかすべきか・・・。Orz
0299デフォルトの名無しさん
2016/02/02(火) 17:00:35.47ID:ucpE/ELv細かいことを言うようだけど &a == &a[0] ではないよ。
下の例で、3つのprintf()は同じ値(アドレス)を表示する。
けれども if の部分で有効なのは最初の行だけ。
下の2つのif行の注釈を外すとコンパイルエラーになるはず。
a と &a[0] は等しい。
&a と &a[0] は(値は同じだが)型が違う。型が違うので比較はできない。
#include <cstdio>
int main() {
int a[] = {1, 2, 3, 4};
printf("a == %p\n", a);
printf("&a[0] == %p\n", &a[0]);
printf("&a == %p\n", &a);
if (a == &a[0]) printf("Equal\n");
// if (&a == &a[0]) printf("Equal\n");
// if (a == &a) printf("Equal\n");
return 0;
}
>>282 の本題、&a と &a[0] の値が同じになる理由は、
配列の中身がメモリにどう格納されるか、を図で表すと分かりやすいんだが
俺の表現力では無理なんでどなたか頼む。
0300デフォルトの名無しさん
2016/02/02(火) 17:01:52.82ID:7f7wf/mWcastして欲しくないからprotectedにしてるんじゃないの?
0301デフォルトの名無しさん
2016/02/02(火) 17:23:10.99ID:5quLb8tiいやー、ハンドルみたいな使い方を規定していて、
自分は外部関数で値を変更したいんですけど、ユーザーには触ってほしくない。
という、わがままな欲求です。
そのうちUnified Call Syntaxが入ったら、いろいろやろうと思ってるところです。
0302デフォルトの名無しさん
2016/02/02(火) 17:25:43.26ID:MIlHcyxrコレ昔VC6でやったら結果が違った
BCC5だとすべて同じ値なのに
0303デフォルトの名無しさん
2016/02/02(火) 17:29:56.27ID:MIlHcyxr0304299
2016/02/02(火) 17:53:41.97ID:ucpE/ELva[] において &a が配列全体のアドレスを表すってのは
ANSI C で統一された挙動だったね。調べ直しちゃったよ。
C++ でも成立するよな。自信が揺らいできた。
0305デフォルトの名無しさん
2016/02/02(火) 17:55:25.15ID:C4M/U0awしかたないね
0306デフォルトの名無しさん
2016/02/02(火) 18:30:04.71ID:1NZHqYvtたまたまお前の処理系がバイト単位でリニアアドレッシングしてるから。
int a[3]; について
&a[0] は先頭要素のアドレス
&a は「a[0] a[1] a[2]」という配列全体のアドレス
だから一致する
0307デフォルトの名無しさん
2016/02/02(火) 18:31:29.65ID:QW7JMPO0https://ideone.com/woT6Lc
&a[0]は要素へのポインタ(一個目の要素へのポインタ)
&aは配列へのポインタ(一個目の配列へのポインタ)だよ
>>231
:(~):
:(i:i:i:i:i):
:(i:i:i:i:i:i:i:):
:( ゙´ω`゙): …
:(:::::::::ソ:::っ:
:し─J ┃:
0308デフォルトの名無しさん
2016/02/02(火) 18:35:17.86ID:KYl+p0oO0309デフォルトの名無しさん
2016/02/02(火) 19:17:24.83ID:WSo7+ODL0310デフォルトの名無しさん
2016/02/02(火) 20:12:44.79ID:po3vtalAなんでsizeof(array)で正しくサイズが出てくるのか分からん
0311デフォルトの名無しさん
2016/02/02(火) 20:35:13.03ID:WkrnCzmR> arrayと&array[0]が同じなら
ポインタに変換したら一緒になると言うだけ
> なんでsizeof(array)で正しくサイズが出てくるのか分からん
array 自体のサイズをコンパイラは知ってるから
0312デフォルトの名無しさん
2016/02/02(火) 20:54:40.03ID:MIlHcyxr&と&&は別物だよ
ちなみに&&は定数も代入できる
0313デフォルトの名無しさん
2016/02/02(火) 20:56:18.82ID:RveVHAYz馬鹿は去れ
0314デフォルトの名無しさん
2016/02/02(火) 21:28:49.56ID:5quLb8tiarray[0] ->配列の要素の型
sizeof(array)はdecltype(array)の暗黙に持ってる長さ情報にアクセスしている?
array == &array[0] はアドレス値は同じだが、型自体は違うので持ってる情報は違うもの。前者はT[]。後者は(&T)
暗黙の型変換でぐちゃぐちゃになってるのはお前の頭だ!
であってる?
0315デフォルトの名無しさん
2016/02/02(火) 21:29:30.66ID:5quLb8ti0316デフォルトの名無しさん
2016/02/02(火) 21:30:29.16ID:MIlHcyxr0317デフォルトの名無しさん
2016/02/02(火) 21:33:13.54ID:5quLb8tiint&& a=int(5);と等価だっけ?
0318デフォルトの名無しさん
2016/02/02(火) 21:34:17.88ID:MIlHcyxrT&&a=n ; でnの参照になったりする。自動で。
0319デフォルトの名無しさん
2016/02/02(火) 21:34:40.95ID:06fZR6NSh.~hoge();
デストラクタはconstついてないのに呼べるのは何故ですか
0320デフォルトの名無しさん
2016/02/02(火) 21:53:06.16ID:RveVHAYz今確認したが同じアドレスになった
どうしてそう息を吸って吐くように嘘をつくのか
ちなみに&aがどこを指しているかわからないのは
Visual C++ 6.0じゃなくてお前のオツムが原因
0321デフォルトの名無しさん
2016/02/02(火) 22:09:17.83ID:MIlHcyxrHotfixいれまくったりすると環境変わるからね
昔のことだからよく覚えてないけど
0322デフォルトの名無しさん
2016/02/02(火) 22:20:22.89ID:RveVHAYzint *p = &a;
error C2440: 'initializing' : 'int (*)[4]' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)
0323デフォルトの名無しさん
2016/02/02(火) 22:51:04.27ID:MIlHcyxrバカでもわかる型の違いですけど
なんでキャストしないのですか?
0324デフォルトの名無しさん
2016/02/02(火) 23:11:50.94ID:x5amnXbsなんで&a[0]にしないのですか?
0325デフォルトの名無しさん
2016/02/02(火) 23:20:08.01ID:RveVHAYzだが>>323の様にどこを指しているかわからないと言ってるのにキャストするのはヤバい
>>318とかはよ病院に行くレベル
0326デフォルトの名無しさん
2016/02/02(火) 23:20:42.79ID:x5amnXbs&a[0]:5文字
0327デフォルトの名無しさん
2016/02/02(火) 23:27:30.24ID:MIlHcyxr病院逝くのは貴様の方だろ
0328デフォルトの名無しさん
2016/02/02(火) 23:31:01.70ID:7f7wf/mW0329デフォルトの名無しさん
2016/02/02(火) 23:40:56.45ID:x5amnXbs0330デフォルトの名無しさん
2016/02/03(水) 00:24:20.72ID:5VKefHqD0331デフォルトの名無しさん
2016/02/03(水) 07:32:59.13ID:Gb259GwX(int*)aって書ける時点でaは配列かポインタだろ
なんでvectorクラスを仮定してんだよ
■ このスレッドは過去ログ倉庫に格納されています