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


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

C++相談室 part69



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

前スレ
C++相談室 part66
pc12.2ch.net/test/read.cgi/tech/1231640498/

※part63, part66 が重複していたようですので part69 としました。

830 名前:828 mailto:sage [2009/06/07(日) 22:14:01 ]
>>829
・・・としますと
Effective C++の未定義だという記述の方が誤りで、
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
の方が正しいと言うことでしょうか?


831 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 03:03:48 ]
多重例外が未定義動作だなんてどこに書いてあった?

832 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 05:20:46 ]
デストラクタで例外を投げてもちゃんと動作は定義されている
意味のある(まともな)動作をさせるのが困難というだけ

833 名前:828 mailto:sage [2009/06/08(月) 06:59:07 ]
>>831
Effective C++ 原著第3版
p39末行
〜p40頭の数行
にかけて、はっきりと未定義と書かれています。

>>832
それもEffective C++で上と同じ節に書いてあります。


834 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 08:03:12 ]
>>830
静的記憶域期間を持つオブジェクトがデストラクタで例外送出したらterminateじゃなかったっけ

と思ったら「staticでnon-local」はterminateらしい
「staticでlocal」は記述が見当たらねぇ…

835 名前:828 mailto:sage [2009/06/08(月) 16:14:44 ]
そしてまあ困ったことに、たしかVC2008とかの有名どころですら
複雑な例外処理の仕様は、正確には実装されていないと聞いたことがあります。

結局は多重例外になるという状況を作らないように気をつけていくしかないのでしょうかね。


836 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:14:03 ]
>>833
そこは仕様書を持ち出すべきだろ。

837 名前:828 mailto:sage [2009/06/08(月) 21:15:40 ]
>>836
私は仕様書を持ってないんですよ。
趣味グラマなもんでして。

838 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:22:44 ]
例外処理の実装を詳しく説明している書籍は何がありますか?




839 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:26:27 ]
more exceptional C++

840 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:55:50 ]
>>837
興味があるならタダで見られる、日本語で。
www.jisc.go.jpから規格番号X3014。

841 名前:837 mailto:sage [2009/06/08(月) 21:58:59 ]
>>840
ありがとうございます。
なんとかDLしたいものですが、ガードされているようですね。

必要に応じてWEBで見るようにします。

842 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 23:40:41 ]
FDISでよければこことか
ttp://www.kuzbass.ru/docs/isocpp/

15.5.1に
>when the exception handling mechanism,
>after completing evaluation of the expression to be thrown but before the exception is caught,
>calls a user function that exits via an uncaught exception,
>...
>In such cases, void terminate(); is called.
とあるから、terminate()が呼ばれるのは間違いないと思うのだが、
Effective C++には確かに未定義っぽいことが書いてあるし…
英語版でもそうなのかなあ

843 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 00:25:07 ]
しかし、デストラクタで例外なげるようなプログラムなんて書く訳無いし、あんまり気にしすぎても仕方ないよ。
いえ、ごめんなさい。

844 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:20:17 ]
関数テンプレートがインスタンスを指定することによって実体化できるのに対し、
クラステンプレートは型名を指定しないと実体化できないところに不便さを感じます(boost::rangeとか特に)。
何かいい方法はないですかね?

845 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:26:59 ]
そのためのtypedefだろ?

846 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:27:22 ]
クラステンプレートは、型を引数に取って型を返す関数

847 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:35:16 ]
>>846
TMPか。

848 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:40:37 ]
>>844
std::make_pairやboost::make_iterator_rangeのように関数テンプレートでラップすればいい。



849 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:41:43 ]
>844
関数テンプレートもインスタンスで指定しているわけじゃないぜ。単に引数の型を推論しているだけ。
#動的な型は対応できない

どうしてもというなら関数テンプレートでラッパー作ればよろし。


850 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:05:43 ]
>>845
型指定するのが手間に思えます。型推論してくれないかなと。
>>846
関数の引数をテンプレートに変更してもそのまま使えるのに、クラスのメンバ変数をテンプレートにすると使う側に手間が増えるのが不便に感じます。
>>848
makeXXXの戻り値を受け取るところで結局型指定が必要になってしまいます。
>>849
書き方が悪かったです。

template<class T>
void F(T t);
template<class T>
class C {
  T t_;
public:
  C(T t):t_(t){}
};
F(hoge);// hogeを簡単に渡せる
C<Hoge> c(hoge);// 型を指定しないと渡せない
この違いを埋めることってできないですか?
rangeを渡す時、後者はめんどくさく感じて仕方ないです。

851 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:13:14 ]
>>850
> F(hoge);// hogeを簡単に渡せる 
> C<Hoge> c(hoge);// 型を指定しないと渡せない 
どう書ければうれしいの?

852 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:31:30 ]
>>851
Hogeを書かなくてよくなればうれしいです。
言語の仕様上、Cを非テンプレートクラスにするしかないですかね。
boost::any使っても値を取り出すことができないし、うーん・・・。

853 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:49:02 ]
class B{public:virtual B&fn()=0;};
template<T>class A:B{public:T t_;A(T t);B&fn();};
class C{A&a;public:template<T>C(T t):a(C<T>(t)){};B&fn(){return a.fn();}};

実現しようと思えば物凄く面倒。

854 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:53:56 ]
>>852
つまりこういうこと?
 C<> c(hoge);

855 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:04:50 ]
>850
F(hoge)のhogeはどのみち静的な型になってるだろ。
C<Hoge>とするのに比べてそんなに汎用性が高くなっているわけじゃないよ。

型を推論してくれるから面倒なことは少ないけど。まあ、素直にC++0xのauto待ちでいいんじゃね?

856 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:40:44 ]
>>853
頭がクラクラしてきます。
>>854
そのコードが許されれば大満足です。
>>855
単純に入力の手間の問題ですね。
boost::range使っていて、コードを書いてる時に型を意識しないといけないのはつまらないなーと思いました。

857 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:54:20 ]
100万回呼ばれるメソッドがあったとして

Hoge * f(...)

Hoge & f(...)

ってどっちがお得なのでしょうか?

858 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:00:24 ]
コンパイラしだいだけど、大体、どっちもいっしょ。



859 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:02:27 ]
100万回程度ならどっちも同じ。

860 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:17:43 ]
>>859

じゃあ1無量大数回なら?

861 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:24:23 ]
呼び出しの時間なんて気にするなってことだろjk
マイクロ秒で競ってどうするんだよ…

862 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:06:29 ]
呼び出し側にも依るが、参照とポインタだけの違いならまったく同じバイトコードになる可能性が高い
参照なんてのは結局ただのポインタだからね

863 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:11:09 ]
参照の場合はコンパイル時のチェックがかかるだけで、バイナリは同じものになるって話を聞いたことがあるが・・・
ホンマかいな

864 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:12:05 ]
コンパイルの時間まで考慮するならHoge*f(...)の方が早くなる可能性があるな

865 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 05:24:40 ]
>>863
絶対じゃないだろうが、その可能性はあるでしょうな。

参照はどう実装しても良いわけで、
別に参照はポインタを用いて実装されているという保証はない。
だが普通ポインタを用いて実装するので、。

866 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:13:43 ]
TCP/IPのソケット通信プログラムなのですが

connectを実行し、接続確認にsendとrecv
を行っているのですが、recvでソケットエラー
が発生し、GetLasterrorでエラーコード
を取得すると「既に使われている(183)」でした。

何故こんなエラーになるのか分からず
困っています。どなたか教えて下さい。

867 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:08:03 ]
環境がわからないし、エラーは正確に書くべき。

868 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:09:46 ]
WSAGetLastError呼べよ



869 名前:866 mailto:sage [2009/06/10(水) 19:33:58 ]
>>867
送信先:Windows2003Server
送信元:WindowsXP
開発:VC2005

recv()の戻り値が-1
WSAGetLastErrorでエラーコードを取得したら
183だった。
ということですm(_ _)m

>>868
すまん、WSAGetLastError使ってた。

870 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 20:26:54 ]
wineをみるとWSAGetLastErrorとGetLastErrorは同じものです。
recvのすぐ後でミューテックスをロック/アンロックなどを
しているんではないですか?

871 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:06:23 ]
class MyClass {
protected:
struct foo_t{
struct bar_t{

}foo;

};

872 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:10:14 ]
すみません。途中で書き込んでしまいました。
class MyClass {
protected:
 enum {NUM = 5};
 struct foo_t{
  struct bar_t{
  }bar[NUM];
 }foo;
};
VC6で上記コードをコンパイルすると、NUMにアクセスできないというエラーが出ます。
NUMをpublicで定義すると大丈夫です。
構造体の入れ子になった場合はpublicでないとアクセスできないのでしょうか?

class MyClass {
protected:
 enum {NUM = 5};
 int foo[NUM];
};
ちなみにこちらは問題ありませんでした。

873 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:13:49 ]
bar_tを外で宣言するか
foo_tに適切なコンストラクタを用意すれば良い

874 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:20:09 ]
gcc4.2.1なら大丈夫

875 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:20:18 ]
レスありがとうございます。

fooはPOD型であってほしいので、コンストラクタを用意するのは望ましくないです。
後出しですみません。

bar_tを外で宣言するというのはどういうことでしょうか?

876 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:21:33 ]
>>874
VC6なのでenumハックを使っています。

877 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:39:37 ]
VC6なんて窓から投げ捨てろ

878 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:40:35 ]
>>876
VC6はもうVC6言語だと思った方がいいくらい、標準と違う。
そんなクソ環境、捨ててしまえ。



879 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:48:19 ]
eclipseとgccにすればっ

880 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:52:01 ]
VCのお手軽感捨てたくなければ最新のExpressって手もあるな
VC6はリソースの編集専用にすればよろし

881 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:52:07 ]
全く持ってその通りなんですが、納品先がVC6で開発してるものでorz

882 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:54:53 ]
納品先を捨ててしまえ!、え?、違うって(ry

883 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:59:41 ]
publicにすればビルドできるのでそうしときます

884 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:06:36 ]
gccってfriendつけないでも平気なんだ 知らなかった

885 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:11:06 ]
今、双方向のリスト構造のテストプログラム組んで思ったんだけど

int main{
  // hpはノードのポインタ型
  //--上・省略--
  hp = hp->next;
  //--下・省略--
}

っていう風にやったら普通にうまくいくんだけど、
これを関数かしてやって
void gotoNextNode(Node* pnode){
  pnode = pnode->next;
}

int main{
  // hpはノードのポインタ型
  //--上・省略--
  gotoNextNode(hp);
  //--下・省略--
}

ってやったら「pnode = pnode->next;」の部分が効かないみたいなんだけどなんでだろorz?

886 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:14:28 ]
それは、ローカル変数に入れても、なにもならん

887 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:15:48 ]
gotoNextNode(&hp);

888 名前:885 mailto:sage [2009/06/11(木) 00:18:06 ]
ノードのポインタ型は下のようになってて
typedef struct _Node{
    int num;
    struct _Node *next;
    struct _Node *back;
}Node;
ポインタ渡してるからいけるんじゃね?・・・って思ったんだけどさ



889 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:19:12 ]
*pnode = pnode->next;
じゃなくて?

890 名前:885 mailto:sage [2009/06/11(木) 00:20:06 ]
んで、hpはNode* hpで定義してます

891 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:20:53 ]
void gotoNextNode(Node* &pnode){

892 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:22:51 ]
C++ならポインタのリファレンスが使えるから

gotoNextNode(Node*& pnode)

893 名前:885 mailto:sage [2009/06/11(木) 00:27:08 ]
うは、確かに*の横に&付けたらうまくいったわサンクスコ
*&なんて使い方初めて知ったわ

894 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:29:27 ]
void gotoNextNode(Node**pnode){
*pnode = (*pnode)->next;
}

型 & hoge
だから別に特殊なことやってる訳じゃないよ

895 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:40:37 ]
なんで二重ポインタやポインタ+リファレンスを使わないといけないんだろう・・・?
ポインタが仮想変数になったときにポインタじゃなくて値として扱われてしまうとか?

896 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:46:44 ]
int i = 5;
myFunc(i);
void myFunc(int a)
{
 a = 1;
}

ってやって、iの値が変わらないんだけど!って言ってるのと同じであることはわかった上で、
不満だと言っている?

897 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:47:44 ]
単純に「ポインタで受け取れば引数の変更が呼び出し元に反映される」と考えてはいけない。
引数に対する変更が呼び出し元に反映されるためには、
変更したいものを指すポインタを受け取るとか、変更したいものを参照で受け取るとか
しないといけない。

>>855の hp = hp->next; というコードは、ポインタの値を変更してるよね。
「変更したいもの」がポインタなんだ。
だから、ポインタのポインタとか、ポインタの参照を受け取らなければならない。

898 名前:897 mailto:sage [2009/06/11(木) 01:48:37 ]
>>855じゃなくて>>885だった。分かると思うけど。



899 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:52:06 ]
void myFunc(int a)
{
 a = 1;
}
の例はすぐに関数抜けた時点でaが開放されて値が消えるってのは分かるけど・・・
その例と同じってのは分かってないわ・・・スマン

900 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:59:13 ]
typedefしたら分かりやすいか?

typedef Node* PNode;
PNode hp;

void gotoNextNode(PNode pnode){
  pnode = pnode->next;
}

int main{
  // 略
  gotoNextNode(hp);
  // 略
}

hpは変更されない。これはほぼ>>896と同じ。
受け取ったPNode値への変更が呼び出し元に反映されるには、PNode* や PNode& で受け取らないと。

901 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:59:44 ]
int型の変数である、iの値を変更したい場合に、
int型を指すことができるポインタ(int*)、もしくは参照(int&)で受けなければならない
というのはわかっているってことね?

だったら、こう置き換えてみたら?
Node*型の変数である、hpの値を変更したいのであれば
Node*型を指すことができるポインタ(Node**)、もしくは参照(Node*&)で受けなければならない

902 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:06:48 ]
あー、typedefで何を言いたいかって考えたらなんとなく分かってきたわ。
単にポインタで受け取る時は値を変更する時にも使うから、
それと同じ状態になって関数を抜けるから無効になってるということで
ポインタを変更したいときはPNode* や PNode& で受け取らないといけないって感じでおk?

903 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:17:44 ]
ポインタを代入したいから >895

904 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:24:21 ]
>>902
まあ、そういう理解でおk。
typedefなんか持ち出して余計混乱させたらどうしようかと思ったが、たぶんちゃんと通じてると思う。

905 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 16:09:30 ]
K&Rでは構造体をうまく使ってわかりにくいダブルポインタを回避していた
C++ならイテレータクラスを作ってポインタのやり取りそのものを回避(中は結局ポインタだけど)

ダブルポインタを使う時点でもしかしたら設計に問題が^^

906 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:45:54 ]
pimplで使うスマートポインタって皆さんどうしてます?
ディープコピー方式のoperator=を持つshared_ptrがあれば便利だと思うんですが、どうもなさそうです。

907 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:54:12 ]
>>906
shared_ptrは浅いコピーだからこそpimplイディオムは生きるのだよ。

でもまあディープコピーにしたいこともあるのかもね。
ディープコピーにしたいってどんな状況?
class MyClass;
class MyClass_impl;
だとして、MyClassのコピーコンストラクタを適切に定義すれば
boost::shared_ptrで十分じゃないかと思うよ。

908 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:07:50 ]
>>907
pimplイディオムを使わないでMyClassを実装した場合と同じ挙動にしたいです。
コピーコンストラクタやoperator=を書かない事(コンパイラまかせ)はよくあるので、
そういった場合にpimplで実装した事によって挙動が変わるのは嫌だなと思います。



909 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:30:54 ]
pimpl使う版と使わない版のMyClassが必要で、その挙動を変えないためってこと?
何のためにそんなことするのかは知らないけど、同じようなクラス2つ書いてコード重複するくらいなら
pimplなんか使わない方がいいよ

910 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:01:04 ]
>>909
pimpl版と非pimpl版の2つがあるわけではないです。
pimplイディオムで実装することによって、注意しなければいけない事を増やしたくないという意味です。
MyClassのコピーコンストラクタやoperator=を書き忘れて(pimplじゃなければ書かなくてもOKだから忘れやすい)
バグが発生したりしないために自動でディープコピーになってくれた方が便利だと思います。

911 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:14:55 ]
>910
boost::any使いなされ。あれは値のセマンティクスになってるよ。
>774みたいに突っ込むコンテナによってセマンティクスを変える手もあるけど。

912 名前:907 mailto:sage [2009/06/11(木) 22:17:10 ]
>>910
あー、言いたいこと分かった。
要は君自身、今のところは問題無くpimplイディオムを使えてはいるけど、
いつかうっかりしそうだからディープコピーなshared_ptrがあったら
いいなぁ
ってことだよね?

でも
>自動でディープコピーになってくれた方が便利だと思います。
いやいやそりゃ困るよ。
浅いコピーだからこそ生きるpimplイディオムの状況ってかなりあるのだよ。
例えばoperator=で浅いコピーにすることにより超高速なコピーが出来るわけ。

913 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:29:39 ]
デフォでshallow copyで
deep copyは明示的にclone()を使うっていう決まりを作るとか

914 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:38:07 ]
デフォはdeep copyで
shallow copyは明示的にdangerous_clone()を使う決まりの方がいいです

915 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:57:35 ]
>>911
pimplにboost::anyを使うというのは初めて知りました。
確かに便利ですね。
弱点をあげるなら、速度が若干遅くなりそうなところでしょうか。

>>912,913
>>914の方が私は直感的にわかりやすく感じます。

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


916 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:07:55 ]
直感的にわかりやすいかどうかよりも、間違いが起こりにくいという点で>>914の方がいいなあ。
間違えてデータ壊れるか、間違えて処理が遅いか、なら後者の方がいい

917 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:48:51 ]
C++はヒープの無い環境でも使えるようになっていて、
組み込みでも実際使われている。
それをデフォでdeep copyなんかにされたらたまったものじゃない。

918 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:09:30 ]
deep copyだとまずい理由がある時は明示的にshallowにすればいいじゃん。
deepで困るケースは少ないんだからデフォはdeepでOK。
つーかshallow copyによる高速化とpimpl関係なくない?たまたま一石二鳥になっているだけで。



919 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:19:44 ]
そもそも、pimplで深いコピーにするのが不可能でも特別面倒でもないでしょ。
ほかのメンバ関数と同じ調子で、コピーコンストラクタとoperator =を定義するだけのはず。

920 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:25:56 ]
だからコピーコンストラクタと代入演算子を定義し忘れるから
Pimplはdeep copyをデフォにして欲しいと言ってんの

もしかしてアフォ?

921 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 02:22:00 ]
shallow copyをする気がないなら、そもそもshared_ptrにしなくていいのでは。
auto_ptrやscoped_ptrにすれば、コピーコンストラクタと代入演算子を定義し忘れることはない
(定義し忘れるとコピーがコンパイルエラー)。

922 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:05:27 ]
>>921
auto_ptrもscoped_ptrも不完全型には使えない。
ttp://d.hatena.ne.jp/Cryolite/20060108 (不完全型によるコンパイラファイアウォールとスマートポインタの両立(その1)以降を参照)

空のデストラクタを書くのも手間だし、コピーコンストラクタと代入演算子を書くのも手間。
deep copyにしたくてshared_ptrを使いたいなんて言ってるやつはいない。pimplにぴったりのスマートポインタないっていう話。

923 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:03:21 ]
うーん。明示的にデストラクタ書かなきゃいけないのがそんなにデメリットだとは思ってなかったんだが
まあ、気にする人も結構いるのか。

924 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:13:30 ]
unique_ptrがoperator=でdeep copyしてくれればいいのに。

925 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 06:54:12 ]
当然じゃねーの?てな部分に疑問を呈す >>922 の様な人が声高に暴れて言語やライブラリのカオス度が濃くなるんだよな
科学技術とか未踏の分野の開拓なら役に立つかもしれんけど邪魔な存在だな

926 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:35:04 ]
しかしpimpl_ptrは何回もrejectされている…

927 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:26:46 ]
pimpl自体、きもいイディオムだから、あんなの使わなくて済むようななにかを追加して欲しい

928 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:27:37 ]
何の話をしているのかいまいちわからないが
ポインタ型があったとして

A a, b;
A *pa=&a, *pb=&b;
pa = pb;

こうしたら、aがbの値に上書きされるってこと?
なんだがおかしいね。
*pa = *pb; だよね普通。




929 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:52:42 ]
個人的にpimplを使うようなでかいクラスは大体コンストラクタとかも
全部ソースで定義するのでscoped_ptrで問題なし

930 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:44:45 ]
ちょいとしつもんだんですが、

30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。

しかし単純に配列を作ってしまうと、やはりout of memoryです。

どうにかして要素数を減らすのが一番だとは思うんですが、

一般的に、このように膨大な要素の配列を扱わざるをえない場合にはどのような方法を用いるのでしょうか?


931 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:49:51 ]
>>930
疎なデータならその部分だけを保持する

932 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:51:08 ]
>>930
速度が滅茶苦茶遅くていいならファイルをメモリと見なし
operator[]をオーバーロードするとか

933 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:09:18 ]
>ちょいとしつもんだんですが、

質問団?w
そのくらいの量なら、64bitOSで普通にnewでもvectorでも持てると思うけど。
まぁ、swapされるのは覚悟する必要があるな。
処で、それ本当に必要なの? 疎行列として扱うとか、boolではなくcharかbitで保持するとかできない?

934 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:29:57 ]
>>933
>64bitOSで普通に
さらっと、OSレベルで条件付け加えんなw
アフォか

935 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:32:54 ]
>>934
2バイト整数を3万掛ける3万なら、32bitOSでも普通にOK。
今時、Windowsでも2GB位積んでるのが当たり前だしね。

936 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:38:47 ]
> 30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。

30,0000?


937 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:41:11 ]
うお、それは気づかなかった。30万なのか?w

938 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:43:13 ]
2G程度あっても無駄無駄無駄ーなのです



939 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:58:11 ]
ごめんなさい!3万x3万です!ちなみに768MBしか積んでません><クズです!
>>931-933
0or1のフラグとして使うつもりでboolを使いました。

やろうと思っていることは、「生物学で使うDNA塩基配列のアライメント」で
int 3マンx3マンを隅から数値を埋めていく一方で、
その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。

ということを行っています。

intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、

bool配列についてはすべて埋め終わった後に、もう一度フラグの確認をしていくのですべて残しておく必要があります。


ちなみにbool型が一番サイズが小さいと勝手に思い込んでいました。

940 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:05:43 ]
なんだか良くわからないけど,計算用の鯖用意すれば解決するんじゃないかな^^;
パソコンでやるなら>>933とか.

でも
> int 3マンx3マンを隅から数値を埋めていく一方で、 
> その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。
これって注意深く行うとすると,今状態[3万×3万]と次状態[3万×3万]が必要になるんじゃないかい?
軽くめんどくさい

941 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:26:39 ]
int配列やbit配列の要素間で、相互参照がないなら
ストレージに対して、逐次読み出し、逐次書き込みで
いいんじゃねーの。

942 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:31:29 ]
塩基配列なら AGTC の4種
30kx30k 900M
1bit データなら 900M/8 = 112MB
塩基配列なら4種2bit 900M/4 = 225MB

メモリに載せるのは可能っぽい

943 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:35:52 ]
>>939
768MBでも仮想記憶があるから屑だなんて言っちゃイヤ!

と言うのはさておいて。

>intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、
これは、相互参照があるってことなのかな?
だとしても、1行3万点として前後1行ずつで併せて3行がメモリにあれば事が足りるよね。
後は、ディスクをぶん回すことになるけどなんとかなりそうだ。
# 最初は1000x1000くらいに絞って作らないとデバッグの段階で死ねるね。

944 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:51:27 ]
連続領域で取ることができないだけなので、int**にして3万を3万回動的確保すればいけるんじゃないの?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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