[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/16 02:43 / Filesize : 202 KB / Number-of Response : 823
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part95



1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part94
toro.2ch.net/test/read.cgi/tech/1329512856/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1331894668/

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

177 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 11:32:06.88 ]
>>166
ベクトル・行列演算クラスを自前で作っても、設計や速度の点で不満が出るかもしれない。
テンプレート使った高速化の設計ならBoostを見てみるといいかもしれない。
参考→ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html

もしくは、浮動小数点やスカラーではなくベクトルや行列の演算は
CPUではなくGPUで処理したほうが圧倒的に早いいいので、
Windows環境限定でそこそこのグラフィックカード使えるなら
DirectX.MathやCUDAを使ったら早くなると思う。(LinuxでGPU使う方法は調べたこと無い)

こいつらより早い行列計算ルーチンを書くのは至難だよ。
CPUの性質やコンパイラの最適化とか熟知してる連中が作ったライブラリだから。

178 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 19:36:09.33 ]
>>155
関係ないけど、未だに32bit環境がデフォと思っているやつは何なんだろうか?


179 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 19:43:35.13 ]
>>177
CUDAが必要なレベルだとかなり大規模になる必要があるし、CUDAの持って行くのには別の苦労もあるから、MKLとかの方がいいぞ。
Sandy-Eがでてからは余程いいVGAはないと大きな差が出ないか、逆に遅くなるからな。

180 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 20:19:12.21 ]
>>177
BoostはFortranのuBlasを再現したものだから
Blits++の方がいい。速度もこっちの方が速いしね。

181 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 20:51:21.10 ]
Blitz++か
あの変態演算子オーバーロードか
カンマ演算子をオーバーロードしたライブラリは初めて見たよ

182 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:13:24.42 ]
よく知らないけどEigenがいいと聞いた

183 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:31:33.61 ]
>>181
>カンマ演算子をオーバーロード
そんなこともできるのか点点点

184 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:40:31.23 ]
>>183
行列の要素を読み込むのに使ってる
ドキュメント読んでみ

185 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:49:13.44 ]
A = 0.5, 0.3, 0.8, 0.2,
0.1, 0.3, 0.2, 0.9,
0.0, 1.0, 0.7, 0.4,
0.2, 0.3, 0.8, 0.4;

こんな書き方をするにはカンマ演算子のオーバーロードしかないだろ



186 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 22:41:45.37 ]
自動的に4×4?

187 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 22:56:32.85 ]
いや
Array<FixedPoint, 2> A(4,4);
って宣言してる

188 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 23:00:15.42 ]
書き方はすっきりするけど
速度的にどうなんだろうか

189 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 23:07:43.73 ]
初期化のつもりだろうからそんなに速度必要ないんじゃね

問題は肝心のテンソルの演算速度

190 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 17:53:27.61 ]
C++ 2010で画面上部のプルダウンメニューからDebugをReleaseへ変更しようとしているのですが、プルダウンメニューが反転していて選択できません。
どうすればよろしいでしょうか?

191 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 18:00:27.85 ]
>>189
Blitz++だと式テンプレート使いまくっててFORTRANと同程度の速度がでるらしい。
ただ、速度求めるなら最初からGPGPU使った方がいい気がするが。

192 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 18:51:40.18 ]
CUDAみたいな類のは4桁×4桁をガンガン回すぐらいじゃないと牛刀
16×16ぐらいなら転送のコストで帳消しになるだろう

193 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 19:05:49.99 ]
OpenCVとか必要ないレベルなら速度にこだわる必要もなくね?

194 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 19:49:45.50 ]
>>191
FORTRANて別に速いわけじゃないのに、なんで使われているんだろ?
やっぱ過去の資産かな?
配列の並びが逆なのが気持ち悪い。

195 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:03:52.87 ]
>>94
つ[ポインタのエイリアス問題]

C/C++はこれがあるために配列で最適化が十分に出来ない
VCなら__restrictとかC99でrestrictという予約語を使うとFORTRANと同等に出来る



196 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:04:11.77 ]
ありゃ
×>>94
>>194

197 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:15:57.73 ]
しかしこの過去スレひどいな

logsoku.com/thread/pc11.2ch.net/tech/1177215582/

ちゃんとここに書いてあるのに

seclan.dll.jp/c99d/c99d07.htm
7.6 restrict ポインタ

198 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:37:06.35 ]
>>194
実際速いから。あとC++じゃベクトル命令(SSEの類ではない)
まともに自動で使えないから。

199 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:45:37.65 ]
pascal の配列演算がなぜFORTRAN と並ぶに達せなかったのかに疑問が沸く

200 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:57:54.26 ]
>>195
C++には無いよ。C++11なら無視されるらしい。

201 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 21:34:30.81 ]
金が足りなかったんだろう

202 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 21:48:23.26 ]
>>198
vector<double> x,y,z;
z=x*y;
的なこと?たしかにRとかで使うけどなれると便利だよな。
Pascalにもあるの?

203 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:14:52.36 ]
>>201
コンパイラでそういうの早くしようとしたら、どういう頑張りが必要なの?
まったく想像がつかないんだけど命令手書きとか?

204 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:19:12.45 ]
>>202
www.ss.isc.tohoku.ac.jp/refer/pdf_data/v36-1p17-54.pdf
www.ss.isc.tohoku.ac.jp/refer/pdf_data/v35-3p21-39.pdf
この辺の話にでてくるベクトル命令

205 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:25:08.49 ]
>>202
B(1:99) = A(2:100)
こんなんとか。
Fortranならある範囲から、ある範囲に対して
演算を行える専用構文が存在するがCやC++には
存在しない。独自の拡張か、環境依存の関数を
使う必要が有る。



206 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:30:31.09 ]
ベクトル回路に乗せやすいように配列データを並べて
固定回数の繰返し構文を見つけて専用命令を充てる。

207 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:55:46.78 ]
C++もstd::valarrayを擬似クラス化して最適化できる
ようにすりゃいいんだけどな。演算子のオーバーロードとか
通常時は、演算毎にループして、最適化がかかった場合は
Expression Templateみたいに一つのループで一つの要素に対する
演算をすべて実行したりとかさ。

208 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:58:09.26 ]
>>203
基礎研究レベルからの積み重ね以外にないだろう
商用のCやFortranのコンパイラがやってる融合変換や自動ベクトル化とか命令の合成とかは全部その上に成り立つもの
別に言語の仕様が高速化に向いてるからだとかいうものじゃない

209 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:06:09.20 ]
>>208
配列演算ができるのと出来無いのじゃ差が大きいよ
GpGPU分野でもFortranがそのまま移植され始めたし

210 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:24:38.00 ]
>>198
ここで言うベクトル命令ってSSEの類じゃないってどういうこと?
インテル系以外のプロセッサということなのか?

211 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:26:50.52 ]
このスレに貼られたリンク先をよく見てみましょう

212 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:35:25.20 ]
>>210
ここではベクトルプロセッサーのベクトル命令の事。
ベクトルプロセッサーの命令は、ループで回しながら
xmm0みたいな固定長のレジスタを使って演算する
わけじゃなく、演算命令に範囲と要素のサイズを
指定するだけ。構造がだいぶ違う。

213 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 00:35:17.00 ]
>>212
なるほどよくわかった。ベクトル機向けだからか。
今だとCUDAに近い感じかな。




214 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 00:59:09.35 ]
>>200
VCにはrestrictはないが__restrictという予約語でこっそりMS独自拡張されてる
ヘルプ見てみ

>>209
D&Eでも禿が「C++は演算分野でFORTRANと張りあうつもりはない」ってはっきり言ってるもんな
でも実際使われてる事も確かだし速度が少し遅くても答えさえでりゃいいって奴がおおいんじゃ
どうしてもいやならFORTRANをリンクして行と列を入れ替えれば済む話だし

ベクトルって並列演算の事だと思うけどスーパーコンピュータはほとんどベクトル機だから(Power PCを
並列につないで使ったりしてるもんな)C/C++で同じ事をやろうとすればOpenMPか>>213のように
GPUを使ったCUDAしかない

しかしGPGPUは単精度という致命的な欠点があって倍精度専用のGPUも発売されているが
これは気軽に買えるようなものではない

215 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:13:25.79 ]
MS独自に拡張されてようとC++11には無い



216 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:16:42.78 ]
ここC++11のスレじゃないんだけど
ちなみにC++03にもないです

俺が言ってるのはPCでrestrict使いたければVCかIntel C++(C99対応)を
買うしかないという事

スパコンも案外独自拡張されてそうだけどな
あれだけ演算速度を重視されるんだから

217 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:22:04.90 ]
あ、やっぱり
ベクトル型スーパーコンピュータのC/C++はrestrictを独自拡張してる物が多いようですね
これがないとベクトルCPUやSIMDが使えないもんなあ

それか素直にC99を使うか

218 名前:デフォルトの名無しさん [2012/05/21(月) 01:28:46.99 ]
std::stringを継承させた
exstringというクラスを作ったのだけど
std::stringのいろんなコンストラクタをそのまま継承クラスでも使う方法ってないの?


219 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:31:36.96 ]
stringクラスに仮想デストラクタはあるのか?まずそれが一番大事
無いとdeleteの時にメモリリークするぞ

次にコンストラクタは継承されないから自分で書き直すしかない
コピペしてそのまま呼び出せばいいのは初期化リストに入れれば良い

220 名前:デフォルトの名無しさん [2012/05/21(月) 01:33:12.86 ]
ポータブルなisnanの実装って可能?
doubleのビットを全部見たらnanについて何が分かる?

221 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:34:33.68 ]
>>219
std::stringにアップキャストしたポインタをdeleteしなきゃリークしねーだろ

222 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:35:11.83 ]
ちなみにexstringをポインタ経由でなくてインスタンスとしてしか使わないのなら問題ないけどな
それからexstring自身のポインタ経由で使うか

std::stringは「失敗した標準ライブラリ」だと良く言われる
理由は多量のコンストラクタに、整理されてない多量のメンバ関数
STLの前に作られたから仕方ないんだが
string用に最適化されている事を期待して諦めているが

223 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:50:02.37 ]
>>219
おまいバカだろ

224 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:56:35.44 ]
>>223
馬鹿というなら具体的な対応策をお前が>>218に呈示してやれよ

225 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 02:52:59.24 ]
全然話は違うけどSTLPortのstd::ropeはどうなったん?
boostもC++11も見捨ててるみたいだけど、自然消滅?



226 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 04:21:31.83 ]
>>220
IEE754でいいなら、ビットパターンでNaNを表現している。

227 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 04:27:55.75 ]
std::stringじゃなくて
<boost/container/string.hpp>
使うのは?

228 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 04:43:06.94 ]
>>227
本当だな
それだとslistも入ってるし不要なstringのメンバ関数がバッサリ切り捨てられてる
全部STLでやれって事だよな

229 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 06:11:32.83 ]
>>216
正式に規格になったから、一応C++11もこのスレに含まれるっぽいぞ。
数カ月前向こうでそういう議論があった。
今C++11スレは、次世代規格やC++11の対応状況とかそんなスレになってる。
つか過疎ってる。

230 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 08:41:00.31 ]
>>217
自分で書けばいいじゃん。
俺はクリティカルになるところは自分でかく。
それ以外は、コンパイラ任せ。

231 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 09:11:46.86 ]
ropeは現在では遅延評価がある言語でエディタ実装する用途以外に使い道無い

232 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 12:36:03.13 ]
ベクトル演算なんて自前でループなんかしないでippあたりのライブラリ使うから
どうでも良い

233 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 19:17:30.82 ]
メモリの断片化を防ぐために、OSが不定期にデータを移動させることがあるそうですが、
現在、これによる影響を考慮するようなプログラムはないと考えてよいでしょうか?

昔(WindowsNTより前?):物理メモリアドレス=プログラムが参照するアドレス
→移動可能メモリを読み書きするにはロックが必要

今:物理メモリアドレスはOS管理の論理アドレステーブルで対応付けされ、プログラムからは常に固定のアドレス

234 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 19:31:11.61 ]
どういうときに考慮する必要があるの?

断片化解消を阻止するプログラムでも作るつもりか?

235 名前:233 mailto:sage [2012/05/21(月) 19:36:58.90 ]
>>234
DirectXにロックするAPIがあるんです。
現在はロックって必要ないはずですよね??



236 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 20:20:42.21 ]
>>235
DMAとかでCPU以外からのアクセスがあるため、OSが勝手に移動すると困る

237 名前:233 mailto:sage [2012/05/21(月) 20:42:28.92 ]
>>236
なるほど。
GPUから見た場合は論理テーブルみたいな仕組みがないので、
明示的に物理アドレスを固定しないといけないということなんですね。

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

238 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 15:19:56.67 ]
uプリフェックスってコンパイラで指定したソースコードの文字コードを
UTF-16に変換してconst char16_t*型の変数に代入するって意味ですよね?
例えばソースコードがエスジスならばエスジスをUTF-16にへんかんするってことですよね?

239 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 20:57:41.81 ]
だいたいあってるけど正確には違う

240 名前:デフォルトの名無しさん [2012/05/22(火) 22:39:22.14 ]
struct X
{
char x;
X( const X& o ) : x(1) {}
X() : x(0) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
X x;
x = X();
return 0;
}

これ、コピーコンストラクタが呼ばれずにx.x != 1になってしまうんですが
なぜだかわかりますか? Visual C++ 2010です。


241 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 22:52:07.80 ]
operator=が呼ばれてるからじゃないんけ

242 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 22:54:31.43 ]
初期化と代入の区別はちゃんとつけよう!

243 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 23:14:03.53 ]
コピーじゃなくて代入だから呼ばれないよね(´・ω・`)

244 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 23:25:39.40 ]
>>240
operator=を書いてみ

245 名前: ◆QZaw55cn4c mailto:sage [2012/05/23(水) 03:17:06.92 ]
>>240
codepad.org/YYHOycgY



246 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 07:22:31.20 ]
同じ事を何度も言わなくてよろしい

247 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 23:34:18.12 ]
template部分特殊化で
int float doubleは同じ処理で
string charは違う
その他のいろんなクラスは汎用処理
ということをしたいとする

int float doubleの同じ処理を3回書かないでプリプロセッサあたりで一回で書いてしまう方法ないでしょうか

248 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 23:41:58.93 ]
template<class Signature>
struct my_class{ ... }; // etc type

template<class T>
struct base_int_float_double{ ... }; // int or float or double

template<>
struct my_class<int> : public base_int_float_double<int>{};

template<>
struct my_class<float> : public base_int_float_double<float>{};

template<>
struct my_class<double> : public base_int_float_double<double>{};

これじゃいかんのか?

249 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 23:47:57.51 ]
>>248
ありがとう
それでいけます

250 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 03:41:09.75 ]
中身はintだけど型がintと違うものを作りたくて
struct exint ; public int
{};
してみたらintはclassじゃないと怒られた。こんなものは作れないってことでいいの?

251 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 04:04:31.20 ]
>>250
D言語でおk

252 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 04:49:36.72 ]
オブジェクト指向もどきだから
何でもかんでもオブジェクトじゃないよ

253 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 13:53:23.19 ]
newしたクラスのコンストラクタで、自分のメンバ変数にさらにnewしてクラスのオブジェクトを持たしている時
一番上位のオブジェクトをdeleteしたらメンバ変数のnewしたオブジェクトも消えるでしょうか?

つまり↓
newオブジェクト@->newオブジェクトA->xxxx ;

と続いている時、newオブジェクト@をdeleteする

この場合はnewオブジェクトAを削除したければ、そいつのデストラクタを呼ばないと駄目?

254 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 13:58:59.65 ]
>>253
newしたオブジェクトはスコープアウトしても消えることがないので、ライターの責任でdeleteする必要がある。
だから消えない。

255 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:00:56.11 ]
>>253
それはデストラクタに書くべき事でしょ
newオブジェクトにもデストラクタを書いておけば全部呼んでくれる
継承してないし簡単



256 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:12:45.06 ]
例えばこれはメモリリークしない

class Base {
public:
Base* bp;
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp; }
~Base() { delete bp; }
};

int main()
{
Base b;

Base* bp = b.pointer();
bp->bp = new Base;
bp->bp->bp = new Base;
bp->bp->bp->bp = new Base;
}

257 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:20:05.69 ]
bpがpublicというのは格好悪いのでprivateにした
やはりメモリリークはない
class Base {
Base* bp;
public:
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp->bp; }
~Base() { delete bp; }
};

int main()
{
Base b;

Base* bp = b.pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
}

258 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:26:34.15 ]
>>253
newしたらdelete
ideone.com/Q8DwX
スマートポインタの方がいい
ideone.com/2PugO
ポインタの必要がなければ普通にメンバにした方がいい
ideone.com/eepV0

259 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 15:23:47.59 ]
>>258
タメになるなぁ。

>>257
ダメになるなぁ。

260 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 15:56:15.57 ]
>>257
リーク以前にそれ無限ループじゃね?

261 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 16:14:14.63 ]
>>260
やってみて言ってんのか

Base() : bp(new Base) {
bp->bp = 0;
}

が何のために書いてあるのか分からないのか

262 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 16:19:57.35 ]
おれもコンストラクタが再起するように見えるけど。
開発環境入ってないから検証できないな。

で、Ideoneで試してみたら、ランタイムエラーだってさ。
ideone.com/ikpg0

263 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 16:36:25.55 ]
うん。スタックオーバーフローだから、実行するまでわかんない。VCとかだと何事も無く終了するw

264 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 16:38:47.40 ]
>>257
ループの件とは別に、
>>256はbp->bp->bpで連結してるけど
>>257はBase::bpでなくmainのローカル変数書き換えてるだけなのでリークする

やりたいことは分かるけどサンプルは盆ミス回避のため実際に実行するに限る
ideone.com/pcKDy

265 名前:264 mailto:sage [2012/05/24(木) 16:41:37.05 ]
>盆ミス
そしてこの凡ミスである



266 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 17:00:14.45 ]
>>261
やってみて言ってんのか

267 名前:260 mailto:sage [2012/05/24(木) 17:43:32.61 ]
>>261
コンストラクタでのnewでまたコンストラクタを呼び出す <---- 無限ループ
試しに bp->bp=0; にブレークポイント仕掛けたけど、そこに到達する前にスタックオーバーフローした
見た瞬間に気が付くと思うんだけどなぁ


268 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 18:47:57.48 ]
既に>259で答えが出てた。

269 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 19:51:23.02 ]
どう見ても永久ループです
ありがとうございました

#include <iostream>

class Base {
Base* bp;
public:
Base(int i = 0) {
std::cout << "Base() " << i << " time(s) called." << std::endl;
bp = new Base(i + 1);
bp->bp = 0;
}
Base** pointer() { return &bp->bp; }
~Base() { delete bp; }
};

int main()
{
Base b;
}

270 名前:240 [2012/05/24(木) 20:52:39.67 ]
>>240 のお答えありがとうございました。こちらは理解出来ました。

ただもうひとつ、疑問があります。
このoperator=()が適用されないんですが
なぜなのかさっぱりです。
というかこれは常識ですか?

codepad.org/z5OlAQXL

271 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 20:57:20.69 ]
暗黙のうちに作られるoperator=(const X<x0,x1>&)があるから。
普通のメンバ関数なのでテンプレートより優先。

272 名前:240 mailto:sage [2012/05/24(木) 21:04:15.42 ]
そうなんですか・・
デバッガでトレースしても何も無いし
暗黙なんて止めて欲しい・・
ともあれ、おかげで対策方法もやっとわかりました。
どうもありがとうございます。

273 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:25:58.77 ]
Base() : bp(new Type()) {
}
初期化リストでnewするって無いよな
スマポ使えとまでは言わんが、せめて
初期化リストはNULL初期化だわ
効率もスマポ使った時と変わらん

Base():value1(NULL),value2(NULL)
try
{
  value1 = new Type();
  value2 = new Type();
}
catch(...)
{
  delete value1;
  delete value2;
}

274 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:42:36.30 ]
いやそこはスマポ使えよ

275 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:43:59.04 ]
NULLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

いや、俺はちゃんとnew_handler記述するよ。



276 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:47:16.61 ]
というかnewがこけるときって、どういう状態なんだろ?
もうガッタガタで、プロセス落とすしかないんじゃないの?

277 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 23:55:28.25 ]
>>276
Effective C++読んでみれ。

第三版はどうなってるか知らんが、第二版ではかなり最初のほうで出てくる話題。
メモリ不足への対策は初級クラスのプログラマでも必須の知識だってことなんだよ。
イメージできないなら、まだ初級プログラマになれてない。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<202KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef