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


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

【初心者歓迎】C/C++室 Ver.72【環境依存OK】



1 名前:デフォルトの名無しさん [2010/03/05(金) 16:51:13 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1264774545/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。


98 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:46:37 ]
どうするのが一般的なんでしょうか?

アクセスしたい変数は2個あって、そのために関数を2個用意するのはバカらしい感じがします。

99 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:49:21 ]
friend

100 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:55:41 ]
>>98
二個用意するのが馬鹿らしいなら設計を見直しましょう。

101 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:21:25 ]
アクセス制御精査を心がけてるよと見せるのが主目的なら
抽出用一時オブジェクトとメンバ関数へのfriend指定を駆使して記述すれ

102 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:34:18 ]
>>96
共通のメンバーを抜き出したクラスをクラスA,Bから参照すればいい。

103 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:42:07 ]
>98
このスレッドに書き込む労力を
アクセッサの実装に使ってください

104 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:49:32 ]
>>98
getter setterは邪悪

105 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 00:01:52 ]
>>93
それ、
  a1.push_back(abc(i));
でよくない?
どうしてもnewしなきゃならないなら、shared_ptrを使うといい。

106 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 23:50:38 ]
>>96
Bに包含されることを前提にAを設計しているなら単にfriend指定すればいい。
そうでなければアクセサを書くか、メンバ変数自体をpublicにすればいい。



107 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 08:50:01 ]
>>105
用途によっては shared_ptr をコンテナに突っ込むより ptr_vector の方がいいかもね。

108 名前:92 mailto:sage [2010/03/19(金) 13:29:45 ]
やはりそうなりますかー。
ネットで調べてもそういう現象が見つからないし、
自分の環境固有の問題なのかなぁ

ちなみに最近ではMFCが使われて無いみたいなこと聞きますが
そうなるとウィンド周りは何で作るのが主流なんでしょう?
SDK? CLI?

109 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:45:15 ]
operator boolをそのまま実装すると色々とよろしくないようでsafeboolなるテクニックがあるようですが
ググっても何をやってるのかさっぱりわかりません

どういう原理でsafeになるのでしょうか?

110 名前:デフォルトの名無しさん [2010/03/19(金) 17:09:07 ]
Linuxでgccを使っています。
プログラム自身が使用しているメモリ量と、システムのフリーメモリ量を取得する方法を教えてください

111 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 17:33:51 ]
>>110
OS板、OSスレでどうぞ。

112 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:40:36 ]
>>109
more c++ イディオム safe bool でググるんだ。

普通にはアクセスできないポインタ型を変換演算子で返せば、ifで評価できるし、あれこれ暗黙な変換がされなくて済む。


113 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:42:30 ]
int a=p+1;こんなのがsafeじゃない意図されない使い方

114 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:48:46 ]
C++0xのexplicit conversion operatorsがあればsafe bool idiomはいらない子ですか?

115 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:56:24 ]
そうだね。
でも、コンパイラの実装を待つことなく工夫してsafe boolを手に入れられる拡張性がC++のいいところだよね。


116 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:55:43 ]
C++のコードをDLLにするのってめんどいな
例外出しちゃいけないからわざわざ例外捉えるだけのラッパー書かないといけないし
引数と返り値にSTL使えないし



117 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:58:13 ]
それを突き詰めていくとな、いつのまにか劣化COMを作っている事に気づくのさ

118 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:02:59 ]
>>116
多分、結局インタフェースコードはCかCOMにすることになると思うよ
労力ばかり無駄にかかる上に、CのDLLやCOMより相互運用性において劣る

119 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:06:13 ]
WindowsならCOMでいいけど
MacやLinuxはどうすんの?

120 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:07:22 ]
>>112-115
ぐぐってみてこのページを見たのですが
ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E5%AE%89%E5%85%A8%E3%81%AA_bool(Safe_bool)

operator bool()ではなくoperator bool_type() constでもよいのでしょうか?

で、operator bool_type() constの挙動は
ok_がtrueであればthis_type_does_not_support_comparisons()のアドレスを返し、0以外の値なのでtrueと動作する
falseならば0をかえしfalseとなる

例文の
if (t2 == t1)や
if (t1 < 0)
のばあいはprivate関数のアドレスを比較するのでコンパイルエラーをはく
ということでしょうか

この場合なぜメンバ関数のアドレスを返り値とするのでしょうか?

質問続きで申し訳ありませんがよろしくお願いします

121 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:10:44 ]
Cでいいんじゃないの
必要に応じてヘッダのみ、またはスタティックリンクのラッパーを書いて提供

つまり
ユーザーコード - C++ラッパー - DLL境界 - Cインタフェース - C++実装
こうなる
面倒すぎて反吐が出るね


122 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:14:39 ]
CORBA(笑)

123 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:18:10 ]
>>120
普通のポインタだったらいろいろできて副作用があるから。

124 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:40:28 ]
>>120
キャストでいじってみるとわかるけどpointer to memberはキャストの制限がきつい
だからかってに暗黙変換されてコンパイルとおって変な動作したりとかがなくなって安全なわけ

125 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 13:56:08 ]
質問です。
速度で考えると、floatとdoubleではどちらを使った方がいいのでしょうか。
最近のPCで動かす場合を考えているのですが、最近はfloatよりdoubleの方が早い、みたいな話を聞いたのですが・・・。

126 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 14:09:45 ]
32bitCPUならfloatもdoubleもそんなに差がないだろ
x86に限定して言うならどちらもFPUにロードした時点で80bitになる
SSE使ってたらfloatの方が速いって事もあるけどな



127 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 14:15:09 ]
>>126
64bitだと差が出ると言うことでしょうか?
そして32bitなら、精度が高い分doubleのほうがよい、という事で合っていますか?

128 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 14:22:25 ]
>>127
ああごめん
今昼間から酒飲んでるから答え半分に聞いてくれ
32bitCPUだとdoubleのロードにメモリアクセス2回必要だわな
64bitCPUだとそんなに差がないってのが正解か

でも実測してみると分かるけどfloatでもdoubleでもそんなに差がないよ
結局FPUの演算に掛かる時間が食われてロードの時間なんて問題に
ならないんだろうな

129 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:12:20 ]
>>125
あなたが究極の性能を目指しているのでもない限り、doubleを使うべきです。

理由は幾つかあります。先ずはメリットを。
・floatの方が演算処理が速い場合もある。特に、ベクタ化できる場合に2倍速くなるかもしれない。
・floatの大きな配列の方が同じ要素数のdoubleの配列よりもキャッシュヒットが期待できる。そもそもメモリ容量的にdoubleではダメかもしれない。
・三角関数などの標準関数はsin()とsinf()のようにfloat版が用意されていればそれを利用できる。

次にデメリットを。
・一部の標準関数にはfloat版が用意されていない。また、sprintf()のようにfloatを渡すことができない場合もある。
・floatとdoubleの変換は一般的にかなり遅い。
・1.5のように書いてしまうとその定数はdoubleになってしまうので、1.5fのようにfloat定数であることを明示する必要がある。
・以上のように、暗黙のdoubleへの格上げを禁止するにはアセンブリ出力を確認するような神経質な手続きが必要になる。
・そもそも実数演算以外のコストが高くてfloatのメリットが殆どないかもしれない。

尚、doubleの方が速いのはCでは20年来の話。「最近はdoubleの方が速い」なんてことはないのでその話をした人は何か勘違いをしている。

130 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:15:13 ]
お前は少しでも速いからと言ってshortを多用する気になるか?
余程のことがない限り深く考えずにintを使うだろ?
floatとdoubleの関係はshortとintの関係と一緒だ。
深く考えたくなかったら黙ってdoubleを使っとけ。

簡単に纏めるとこれでいいだろw

131 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:18:59 ]
>>129
メリットとデメリットの説明が逆のような気がする…。

132 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:22:36 ]
>>131
いや、2行目に空白があるだろ?そこの行間を読んでみると、
彼はfloatにした場合の説明をしているんだろう。



133 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:28:24 ]
>>125
とりあえず自分のマシンで実測してみれば?

134 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:29:16 ]
>>133
そして/fp:fastを付けずにfloatが遅いと言い出すわけだ

135 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:32:47 ]
>>132
そ、そんなところに空白が…!!!

136 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 18:26:02 ]
GPUに仕事ぶん投げて非同期にやらせればいいじゃない



137 名前:129 mailto:sage [2010/03/20(土) 19:51:23 ]
おっと、途中で構成を変えたのが裏目に出たようで。失敬。

>>136
正直、今の4coreCPUならGPUにぶん投げられるような仕事はかなり特殊と言わざるを得ません。
実装の手間を考えると、IntelCompilerで最適化する辺りが無難ですね。
いずれにしても、普通のプログラマが意識するような領域では普通にdoubleを使ってgccなりVCなりで
コンパイルするだけで充分です。

138 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 05:29:48 ]
typedef struct tHOGE
{
int x ;
TCHAR[256] str;
}HOGE;

std:vector<HOGE> vHoge ;

見たいな感じのものをstd:sortを使ってx又はstrで
並びかえる事は出来ますか?


139 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 05:34:13 ]
>>138
すみません
TCHAR str[256] ;です><

140 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 06:51:01 ]
>>138
比較関数を自分で書けばソートできる

141 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 09:42:10 ]
>>138
簡単
std::sortの第三引数に叙述関数の名前を書くか、関数オブジェクトの
名前を書いて、叙述関数または関数オブジェクトを書けばソート可能

142 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 10:01:12 ]
>>138

ideone.com/q1vUcaVV

こんな感じな

143 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 10:51:46 ]
>>140-142
出来ましたありがとうございます
ソースわかりやすかったです

144 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 10:58:23 ]
deprecated conversion from string constant to ‘char*’

の意味をぐぐってみたが、C++0xで廃止予定との事なので
現行標準C++では関係ない

145 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 12:26:39 ]
>>144
というか
C++0xで廃止予定
だから
deprecated conversion
なんじゃねぇの?

146 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 12:28:17 ]
(=゚ω゚)?



147 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 12:32:22 ]
>>146
いやだから廃止予定だから deprecatedなんじゃね?と

148 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 12:46:23 ]
C++0xで廃止されるかどうかは関係なく
現行のC++03でdeprecatedだから素直にconst付けろ

149 名前:デフォルトの名無しさん [2010/03/21(日) 13:59:07 ]
C++でatollっぽいこと(文字列→long long int)がやりたいんだけどどうやればいいの?

150 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 14:00:55 ]
lexical_castとかstringstreamとか

151 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 14:11:20 ]
atoll使えばいいじゃん

152 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 14:28:31 ]
class Hoge {...}; があるとして
Hoge hoge; を禁止して
void func(Hoge hoge); func(Hoge(...)); を許可したい
つまりテンポラリなオブジェクトとしてfuncの引数に渡す時のみ生成を許可したい
こういうことは可能でしょうか?

153 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 14:31:02 ]
>>152
Hoge のコンストラクタを private にして func を friend にして、
Hoge は func の中で生成する。

154 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 14:55:28 ]
operator void*とoperator boolが同一の動作をするというのがよく判らない
これはどういうことでしょうか

155 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 15:00:34 ]
>>154
if や条件演算子の条件式として使う分には同じ結果が得られる、ということ。
void* なら意図しない暗黙変換による間違いをいくらか防げる。しかし完全ではない。

156 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 15:06:07 ]
レリーズwwwwwってかwwwうほっ



157 名前:デフォルトの名無しさん mailto:sage [2010/03/21(日) 15:06:16 ]
誤爆

158 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 16:50:36 ]
簡単な二次元テーブルクラスを作ってみようと思ってやってみたんですが
width*heightの大きさの配列を一回で確保して、data[width*y+x]でアクセスというやり方が一般的で良いと聞いたんですが
width*heightが大きくなるとメモリを確保出来なくなってしまいませんか?
WORD最大*WORD最大ぐらいまでしか確保してくれません
こんな中途半端なやり方がほんとに一般的に見て良いものなんでしょうか?

159 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 16:53:58 ]
>>158
無茶な釣りは結構です。

160 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 17:05:49 ]
>>158
メモリが何メガバイト必要か計算してみよう。


161 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 00:34:26 ]
codepad.org/yZs7gMD8

こういうのってありですか?
つうかもっと簡単にクライアントに引数の並べ替えを提供するテクってありますか?

162 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 02:15:39 ]
>>158
> width*heightが大きくなるとメモリを確保出来なくなってしまいませんか?
当然なるでしょう

data[width*y+x] の結果に法則性は無いのか、全くのバラバラならば仕方ないけど、
たとえば、100,500 の結果から 500,100 の結果は通常計算より簡単に導き出せないか。
または、ある要素番号の結果の符号を反転すれば他の要素の結果にならないか。
そんなふうにして配列数は半分に減らせないか色々考える。
多少妥協してテーブルを正規化していくしかない。

163 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 08:38:33 ]
>>161
Boost Parameter

164 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 12:33:53 ]
マクロは使いたくないです

165 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 14:13:37 ]
マクロ使いたくない?ならC使うな

166 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 14:29:24 ]
こんなんどうよ
template <typename LHS,typename RHS,typename RET> RET argswap2(RET (*p)(LHS,RHS),LHS a,RHS b){return p(b,a);}
int sub(int a,int b){return a-b;}

cout << sub(10,2) << endl;
cout << argswap2(sub,10,2) << endl;



167 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 22:52:07 ]
>>161
並べ替えを許可する引数の型が全部違えばできないこともない
codepad.org/kJHyMc72
引数が多いときは大変だがTypeList使うかenable_ifを駆使すればどうにかなる。

168 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 23:24:45 ]
その引数の並べ替えって意味あるの?

169 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 23:16:15 ]
組み込み型のデストラクタを明示的に呼び出すことになっても問題ないのでしょうか?

170 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 23:30:51 ]
問題無いはず。
STLのコンテナの内部で普通に行われてる。

171 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 23:31:14 ]
>>169
どういうソースコードを組めばそうなるってこと?

172 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 23:32:57 ]
>>169
placement newに対応するデストラクタ呼び出しなら必要だけど?
それ以外?

173 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 23:44:31 ]
>>167
どうもです
面白いですね
templateだけで汎用化できるならそれに越したことはないんですが完全には難しいですね


>>168
fromとtoどっちが先だっけ・・・というときに明示できると助かったり(この例だけだと微妙だけど数が増えると結構便利)
あとは複数個デフォルト引数の指定があるけどひとつだけ自分で決めたいといったときに使えるかな、と
void func(A a1 = A(1), A a2 = A(2)); // a2だけ指定したいけど出来ない
void func(A1Is a1, A a2 = A(2))
{
func(a1.value, a2);
}
void func(A2Is a2, A a1 = A(1))
{
func(a1, a2.value);
}
func(A2Is(a)); // a2だけ指定できる
といった感じで組み合わせを全部スクリプトに吐かせて使う感じ
例えばWindowを生成する関数でcreate_window(TitleIs("test"), WidthIs(w), HeightIs(h));と言った感じで一部だけ決めて残りはデフォルトを使うとか考えられる

174 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 00:21:25 ]
>>173
こんなのとか
codepad.org/Mn585Q6T

175 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 12:41:28 ]
とあるクラスの操作で
以下のように

T* hoge = new T;
hoge->~T;
*hoge = new(hoge) T;
hoge->~T;

delete hoge;

初回のみnewで確保してその後はplacement newを利用して初回確保した領域にオブジェクトを生成し
最終的にデストラクタで領域を開放する、と言う操作を行って大丈夫なのでしょうか?

176 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 12:54:20 ]
>>175
大丈夫かもしれないし、大丈夫じゃないかもしれない。

本当にそんなことをする必要があるのかよく確認して、その必要性を示す
コメントが添えられていれば、やってもいいかもしれない。



177 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 12:57:28 ]
>>175
デストラクタを2回連続で呼んでる

178 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 13:10:15 ]
クラスAを生成するファクトリがあって、

A *FactoryA::create(ArgX, ArgY, ArgZ, ...)
{
new A(ArgX, ArgY, ArgZ, ...);
}

このような形で引数をそのままnewにデリゲートしています
Aが固定ならコンストラクタの数だけオーバーロードを力任せに追加すればいいのですが、
Factory<A>のようにテンプレート引数の場合になると力任せではできません
この手の問題を回避する方法はありますか?

179 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 13:17:03 ]
>>177
deleteのときにhogeにオブジェクトが存在するときのみデストラクタが呼ばれるよう工夫することは出来ないでしょうか

やはり素直に1回の処理ごとにnewとdeleteを繰り返した方が良さそうですね、ありがとう御座いました

180 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 13:34:25 ]
void *v = ::operator new (sizeof(Hoge));

T *p = new (v) T;
p->~T();
operator delete (p, v);

p = new (p) T;
p->~T();
operator delete (p, v);

::operator delete (v);



それにしてもなんで
delete (v) p;
って書けないんだろうな
placement new/delete関係は仕様がなんか気持ち悪い

181 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 13:36:02 ]
>>179
君が欲しいのは boost::optional かもしれない。

182 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 17:57:19 ]
>>175
newはそんなに遅くない。

vectorがそれやってるから。

vector<T> hoge(1);//placement newされる。
hoge.resize(0); //デストラクタが呼ばれる。
hoge.resize(1);//placement newされる。
//スコープから出れば勝手にデストラクタが呼ばれる。


183 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 18:15:41 ]
非POD型に
T *p = new (v) T;
って不味いんじゃなかった?配置構文なんてあまり使わんから勘違いだったらすまん

184 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 18:25:03 ]
PODじゃなくても問題ないよ

185 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 18:27:38 ]
実際placement newと普通のnewってどのくらい速度ちがうん?
誰か理論値知らない?

186 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 18:44:42 ]
単純に考えて(placement new/deleteの回数*生メモリ確保/開放にかかる時間)の分だけ速くなる
生成破棄しまくる場合はスゲー速くなるけど、そうでない場合はほぼ無意味



187 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 18:49:22 ]
逆に言えば生成破棄しまくるなら早くなるんだよね?
うし、ちょっと実測してくる。ありがとう。

188 名前:デフォルトの名無しさん mailto:sage [2010/03/25(木) 18:49:40 ]
>>184
あれ、どういうとき不味いんだっけ・・・

189 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 19:15:46 ]
>>188
アライメントの問題ぐらいじゃね?

190 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:10:02 ]
もしまずい点があるとしたら
配列をoperator new()と配置newを使って確保したものに対して
delete[]を使えない、とかそういう点。

191 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:13:46 ]
>>190
それはnewの時も事情は同じだよね

192 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:28:29 ]
C++0xのunionで非POD形が使えるようになるのはplacement newを使うためなのかな?
今まではboost::variantのようなことをするには配列で領域取ってたけどunionでアライメントの問題も無く簡単に使える様になるのか?

193 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:37:45 ]
D&E第三版がC++0xが出た後で出版されるよな

194 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:50:24 ]
>>191
「new演算子」は、operator new()で領域を確保し
コンストラクタを呼び出して初期化することが決まってるんじゃなかったかな。
規格読んでないから知らんけど。

もしそうなら、その方法で確保したオブジェクトをdeleteで解放することも許されそうだが。
規格読んでないから知らんけど。

また、少なくとも
p = new T();
p->~T();
new (p) T();
したものに対しては
delete p;
は大丈夫なんじゃなかったかな。
規格(ry

195 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:54:41 ]
>>194
いや俺が言ってるのは「配列new」も存在しないね、という事

196 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 20:55:40 ]
言い方がまずいな

new A[]; とかは出来るけど、呼び出せるのはデフォルトコンストラクタのみ
引数付きコンストラクタは呼び出せない



197 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 22:00:43 ]
operator new/deleteのオーバーロードとかplacement new/deleteはたまに使うけどそれの配列版は一度も使った事ない俺ザンギュラ
というかコンパイラで挙動が違うし、ググッても仕様が良く解らんしで諦めた

198 名前:デフォルトの名無しさん mailto:sage [2010/03/26(金) 22:54:00 ]
アロケータの自作は理解が深くないと大変なことになるから怖いよね






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

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

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