アカウント名:
パスワード:
CとC++は似て異なるものです。
少しでもC++を使うのなら、C++を完璧にマスターし完全なコーディングをしなければ、ぱっと見はわからない落とし穴を無意識のうちに掘りまくることになります。
ちなみに、例外を使わない、というのは大変ですよ。
私、
コンパイラの設定で例外をdisableし、newが失敗したときに例外をthrowする代わりにNULLを返すように設定
すればいいと思っていたんですが、
class foo ;void func1(foo arg) {// 中略} void func2(void) { foo one ; // これは成功 func1(one) ; // oneをコピーするときにメモリが足りず失敗したとき、どうなる?}
ポインタをNULLチェック・・・しようにもポインタないじゃん、と。
func1(one) ; // oneをコピーするときにメモリが足りず失敗したとき、どうなる?
そもそもclassを値渡しにする理由はなんでしょうか?値渡しを止めて、コンストラクタをpublic公開を止めてfooを生成するstaticのメンバ関数を用意するのではだめでしょうか?
むしろクラスを使わずに、better Cとして使うって事じゃないかと。
同意。
逆に昔GCCがCを独自拡張したように、C++を使わず「Cではない何か」を作った方が早いような。
この例でメモリが足りなくなる場合というのはすなわちスタックオーバーフローですので、普通の処理系では単にsegfaultして終了だと思います。私はこのような状況で例外を飛ばすように仕込まれたコンパイラを見たことがありません。
C++の規格でもこの場合に例外を飛ばすことは要求していなかったと思います。
そのコードはnewしていないですよCと同じようにスタックオーバーフローするだけじゃないですか?
おまいら、なに釣られてるんだよ。
元記事は
> 少しでもC++を使うのなら、C++を完璧にマスターし完全なコーディングをしなければ、ぱっと見はわからない落とし穴を無意識のうちに掘りまくることになります。
の例を己の身を犠牲にして示してるんだよ。讃えてやれよ。
確かに、Javaから入った人とかだと意識しないポイントかもしれない。
void func1(foo arg) {
設計の悪さを感じるのは、私だけ? "const foo& arg" でないとすると、 arg は func1 内で作業用に使われるということだから、 それってスタイル的にどうなのかなぁ、と。
同感。foo がレジスタに乗るほどの大きさなら良いけど、もし乗らないほど大きいとしたら、値渡しするのは筋の悪い設計だと思いますね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲはアレゲを呼ぶ -- ある傍観者
混ぜるな危険 (スコア:0)
CとC++は似て異なるものです。
少しでもC++を使うのなら、C++を完璧にマスターし完全なコーディングをしなければ、ぱっと見はわからない落とし穴を無意識のうちに掘りまくることになります。
ちなみに、例外を使わない、というのは大変ですよ。
私、
コンパイラの設定で例外をdisableし、
newが失敗したときに例外をthrowする代わりにNULLを返すように設定
すればいいと思っていたんですが、
ポインタをNULLチェック・・・しようにもポインタないじゃん、と。
値渡し仕分け (スコア:1)
そもそもclassを値渡しにする理由はなんでしょうか?
値渡しを止めて、コンストラクタをpublic公開を止めてfooを生成するstaticのメンバ関数を用意するのではだめでしょうか?
Re: (スコア:0)
もちろん、STLが値渡しだからといって巨大なクラスを直に値渡しするのは良くありませんが、それはまた別の話。
Re: (スコア:0)
むしろクラスを使わずに、better Cとして使うって事じゃないかと。
Re:混ぜるな危険 (スコア:2)
同意。
逆に昔GCCがCを独自拡張したように、
C++を使わず「Cではない何か」を作った方が早いような。
Re: (スコア:0)
何で書くのがいいのかって話に・・・
Re:混ぜるな危険 (スコア:1)
F社のCOBOLはCOBOLで書かれていると聞いたが、それはさすがにちょっと引く。
Re: (スコア:0)
この例でメモリが足りなくなる場合というのはすなわちスタックオーバーフローですので、普通の処理系では単にsegfaultして終了だと思います。私はこのような状況で例外を飛ばすように仕込まれたコンパイラを見たことがありません。
C++の規格でもこの場合に例外を飛ばすことは要求していなかったと思います。
Re:混ぜるな危険 (スコア:1)
Re: (スコア:0)
そのコードはnewしていないですよ
Cと同じようにスタックオーバーフローするだけじゃないですか?
Re:混ぜるな危険 (スコア:1, おもしろおかしい)
おまいら、なに釣られてるんだよ。
元記事は
> 少しでもC++を使うのなら、C++を完璧にマスターし完全なコーディングをしなければ、ぱっと見はわからない落とし穴を無意識のうちに掘りまくることになります。
の例を己の身を犠牲にして示してるんだよ。讃えてやれよ。
Re: (スコア:0)
確かに、Javaから入った人とかだと意識しないポイントかもしれない。
Re: (スコア:0)
設計の悪さを感じるのは、私だけ? "const foo& arg" でないとすると、 arg は func1 内で作業用に使われるということだから、 それってスタイル的にどうなのかなぁ、と。
Re: (スコア:0)
同感。
foo がレジスタに乗るほどの大きさなら良いけど、
もし乗らないほど大きいとしたら、値渡しするのは筋の悪い設計だと思いますね。
Re: (スコア:0)