■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part25
251 名前:デフォルトの名無しさん :03/11/11 18:28
>>250
もしかして namespace が原因かも!
std::着け忘れてた

252 名前:デフォルトの名無しさん :03/11/11 19:05
>>251
やっちゃったかも!

253 名前:デフォルトの名無しさん :03/11/11 23:35
>>251
うにょ〜ん。

254 名前:デフォルトの名無しさん :03/11/11 23:37
うー、おいらもその手のケアレスミス、多いくて悩んでるぞ〜



255 名前:デフォルトの名無しさん :03/11/11 23:50
けあれすういすぱー

256 名前:デフォルトの名無しさん :03/11/12 00:23
うぉううぉうぉー

257 名前:デフォルトの名無しさん :03/11/12 00:33
ガオーガオー

258 名前:デフォルトの名無しさん :03/11/12 02:28
オガーザーーン

259 名前:デフォルトの名無しさん :03/11/12 04:04
うちのチームにもいるよ。その手のニアミス・バカが。
でも安心しろ。そいつは東大卒だ。(マジネタ)


260 名前:デフォルトの名無しさん :03/11/12 08:26
↑真ニアミス・バカ


【名-1】ニアミス、(航空機の)異常接近、衝突危険、危機一髪、至近弾、目標に極めて近い成果
【名-2】成功の一歩手前、いま一歩、もう一歩のところ、惜しい失敗



261 名前:デフォルトの名無しさん :03/11/12 11:07
別に間違ってないような。

262 名前:デフォルトの名無しさん :03/11/12 11:10
CCで Member templates not implemented ってでるんですか
これってなんなんですか?

何がエラーなのかさっぱりわかりません

263 名前:デフォルトの名無しさん :03/11/12 11:26
>>262
メンバ関数テンプレートは(このコンパイラは)実装していません、ってことなんじゃ?

264 名前:デフォルトの名無しさん :03/11/12 11:50
>>263
じゃあ、そのクラスを継承してすべての型に対してメンバー関数を定義しなくちゃいけないの?
そんなめんどい事をCCではやらなきゃいけないのか…

265 名前:デフォルトの名無しさん :03/11/12 12:30
>>264
>そんなめんどい事をCCではやらなきゃいけないのか
>そんなめんどい事をCCではやらなきゃいけないのか
>そんなめんどい事をCCではやらなきゃいけないのか
>そんなめんどい事をCCではやらなきゃいけないのか

266 名前:デフォルトの名無しさん :03/11/12 13:53
>>265 言いたい事があるのならはっきりいえよ。臆病者。

267 名前:デフォルトの名無しさん :03/11/12 19:26
>>262
Member templates not implemented というと、こういうのか?

class ogrish
{
template <class green> void trainhit(green);
};

M$のコンパイラだと
template <class green> void ogrish::trainhit(green neesan)
{
}

ができないのがある。(詳しくはリリースノートを見れ)

268 名前:デフォルトの名無しさん :03/11/12 19:29
>>266
自分で考えろ

269 名前:デフォルトの名無しさん :03/11/12 19:57
>>268
>自分で考えろ
>自分で考えろ
>自分で考えろ
>自分で考えろ

270 名前:デフォルトの名無しさん :03/11/12 20:29
#include<iostream>
using namespace std;

int main(){
unsigned char *p;
//unsigned char cell[256][256][256];
unsigned char nx,ny,nz;
p= new cell[256][256][256];
if(p){
cout << "Memory was allocated.\n";
}else{
cout << "Can't allocate memory.\n";
}
delete p;
return 0;
}

これをコンパイルすると、
:8: parse error before `['
とでてきます。なぜだか全くわかりません。どなたか教えてください。
ちなみに、エラーはここだけです…

271 名前:デフォルトの名無しさん :03/11/12 20:39
>>270
p= new cell[256*256*256];


272 名前:デフォルトの名無しさん :03/11/12 20:40
>>270
cellの宣言がないだろ(゚Д゚)ゴルァ!!

273 名前:デフォルトの名無しさん :03/11/12 20:40
>>270
newは失敗してもNULLを返さないぞ

274 名前:デフォルトの名無しさん :03/11/12 20:41
>>271thx!なんか殺伐としてますけど、相談室として活用させて下さいまし…

275 名前:デフォルトの名無しさん :03/11/12 20:41
newがNULLを返すようにするにはnew (nothrow) とする必要がある。

276 名前:デフォルトの名無しさん :03/11/12 20:48
>>270
cell (*p)[256][256];
p = new cell[256][256][256];
delete[] p;

277 名前:デフォルトの名無しさん :03/11/12 20:49
p= new cell[256][256][256];
これを
p= new(nothrow) unsigned int[256*256*256];
としたらうまくいきました。 ちょっと急ぎなもので…こんなことに
みなさまのお知恵をお借りして済みません。
ありがとうございます。

278 名前:270 :03/11/12 20:54
やっぱりうまくいきませんです…もうすこし頑張ってみます…

279 名前:270 :03/11/12 21:02
#include<iostream>
using namespace std;

int main(){
unsigned char *cell;
unsigned char nx,ny,nz;
cell=new unsigned char [256*256*256];
if(cell){
cout << "Memory was allocated.\n";
}else{
cout << "Can't allocate memory.\n";
}
delete cell;
return 0;
}

うまく逝きました。

280 名前:デフォルトの名無しさん :03/11/12 21:57
>>270
delete[] cell;
つってんだろゴルア!!

281 名前:デフォルトの名無しさん :03/11/12 21:57
確かに逝ってる。
delete[] cell;

>273
VC++6.0ですが何か。

282 名前:デフォルトの名無しさん :03/11/12 22:05
VC++6.0 is not C++ Compiler.

283 名前:デフォルトの名無しさん :03/11/12 22:13
冠詞のない英文は違和感が残るのう。

284 名前:デフォルトの名無しさん :03/11/12 22:13
cfront is not C++ translator.

285 名前:デフォルトの名無しさん :03/11/12 22:14
GNU is not UNIX

286 名前:デフォルトの名無しさん :03/11/12 22:18
My father is my mother.

287 名前:デフォルトの名無しさん :03/11/12 22:22
チンコ is very strong.

288 名前:デフォルトの名無しさん :03/11/12 23:12
>>281
ちょっとVC++6.0と言うのが遅い。もう古いし。

289 名前:デフォルトの名無しさん :03/11/12 23:44
typedef cell cellarray[256][256]
cellarray* p = new cellarray[256];

これでもダメ?

290 名前:デフォルトの名無しさん :03/11/12 23:54
XINA is not assembler

291 名前:デフォルトの名無しさん :03/11/12 23:55
>>265はCCが何のことなのか知らないだけだろ。

292 名前:デフォルトの名無しさん :03/11/13 00:04
>>290
XINA知ってる人は少ないと思うぞ…

293 名前:デフォルトの名無しさん :03/11/13 14:16
class C {
    // : いろいろ定義
};
つーのがあるときに
C* p = new C; // って言う記述と、
C* p = new C(); // って言う記述は、等価?


struct S {
    // : いろいろ定義
};
つーのがあるとき、
S* p = new S; // って言う記述と、
S* p = new S(); // って言う記述は、等価?


294 名前:デフォルトの名無しさん :03/11/13 14:25
>>293
等価。

ついでにいうと、class と struct はデフォルトでメンバが
public になるか private になるかの違いがあるだけで、後は全く同じもの。

295 名前:デフォルトの名無しさん :03/11/13 14:36
>>294
structってメンバ関数定義できたっけ?

296 名前:デフォルトの名無しさん :03/11/13 14:39
出来る、294が書いてるようにアクセス制御が違うだけ。

297 名前:デフォルトの名無しさん :03/11/13 15:54
>>293
非等価。
初期化されていない POD 型メンバの扱いが変わる。
( ) を付けると初期化されていない POD 型メンバの
デフォルトコンストラクタも呼ばれ、
例えば int a; というメンバがあれば、0 で初期化される。
( ) を付けないと 0 で初期化されない。
また、new int と new int() など、
POD 型を直接 new する場合も同様になる。

でも、実用上、初期化していない POD メンバは
初期化しなくても動作するように組まれている筈なので
等価と言っても構わない。

>>294
他には
 ○ template<class TYPE>
 × template<struct TYPE>
という違いも。

298 名前:デフォルトの名無しさん :03/11/13 15:56
補足
 POD 型を直接 new する場合には、
 この違いを意識する場合があるかもしれない。

299 名前:デフォルトの名無しさん :03/11/13 15:58
>>297
二つ目の指摘はclassキーワードを使いまわしただけなのでこの場合は不適かと。
ただし、以前のVC++ではtemplate<class T>に対してstructを渡すことが出来なかった。

300 名前:デフォルトの名無しさん :03/11/13 16:04
>>297
手元の VC7.1 では class でも struct でも同様の結果だったけどこれは単に VC7.1 が不適合なだけ?

301 名前:デフォルトの名無しさん :03/11/13 16:08
>>297
( ・∀・)つ〃∩ヘェーヘェーヘェー

いやごめん。ちょっと役立ちそうな知識だから、
( ・∀・)つ〃∩ ガッテン!ガッテン!ガッテン!
にしとくわ。

302 名前:デフォルトの名無しさん :03/11/13 16:12
テンプレートで使うことがたまにあるぽ。
new TYPE() って感じに。

303 名前:デフォルトの名無しさん :03/11/13 16:29
>>297
new S と new S() の違いは知らなかった。
確かに G++3.2 では違うコードが出力されている。
(でもどう違うかはわからん)
g++2.91 と 2.95 では全く同じコードが生成された。
うーん、何のためにこんな仕様になってるんだろう。
int() なんかは理解できるけど。

304 名前:300 :03/11/13 16:31
ゴファッ!
元質の意味を勘違いしてた。
struct/classの違いかとおもてたーよ。

>>303
>>302参照

305 名前:デフォルトの名無しさん :03/11/13 17:07
>>297
>例えば int a; というメンバがあれば、0 で初期化される。
>でも、実用上、初期化していない POD メンバは
>初期化しなくても動作するように組まれている筈なので

つまり()付きは実行速度上不利でつか?(現実問題として無視できる処理時間だったとしても)

306 名前:デフォルトの名無しさん :03/11/13 18:39
C++のソースファイルやヘッダファイルのファイル間の
依存関係を出力してくれるツールってありませんか?

307 名前:デフォルトの名無しさん :03/11/13 18:42
>>305
つうかそれ位asmコード吐かせればすぐ分かるだろ

308 名前:デフォルトの名無しさん :03/11/13 18:42
>>306
doxygen

309 名前:デフォルトの名無しさん :03/11/13 18:52
>>297
それは脳内仕様ではなく、ANSIか何かの規定ですか?
少なくとも bcc 5.5.1 では、>>297はダウトでした。

310 名前:306 :03/11/13 19:01
>308
doxygenで解決できそうです
ありがとうございました

311 名前:デフォルトの名無しさん :03/11/13 19:55
もし、仕様上 new S() と new S の動作に>>297のような違いがあるとする。
ならば、ヒープではなくスタックやグローバル領域に確保したオブジェクトにも
同様な使い分けが出来るはず。(メンバ初期化動作の違いなのだから)

S obj; これはいい。
S obj(); こうは書けない。

どう書けばPOD初期化を伴うコンストラクタを呼び出せるのだろうか。

312 名前:デフォルトの名無しさん :03/11/13 20:25
struct A{
int a;
};

int main(){

A *a=new A();
printf("%d\n",a->a);
}

VC7.0での結果

-842150451

>>297は大法螺吹きの予感・・・


313 名前:デフォルトの名無しさん :03/11/13 20:28
>>311

>>297がウソテクかどうかは置いておくとして、

S obj=S();

と書けば呼べると思う。

314 名前:デフォルトの名無しさん :03/11/13 20:29
コンパイラが用意したデフォルトコンストラクタは「何もしない」んじゃなかったっけ?
だから>>312は正解だと思う。

315 名前:デフォルトの名無しさん :03/11/13 20:30
ちょっと質問なんだけど。
C++でconst変数を定数として使う時
複数のファイルで使い回したい時はどうすればよいのでしょうか。

316 名前:デフォルトの名無しさん :03/11/13 20:31
>>315
ヘッダファイルに書け

317 名前:デフォルトの名無しさん :03/11/13 20:32
>>315
ふつうにヘッダに
static const int HOGE = 100;
とか書いておけば。

318 名前:デフォルトの名無しさん :03/11/13 20:35
本当に仕様で決まっているのか、それとも
gccの処理系固有動作(確かにgcc3.xxでは初期化された)を
まるで言語仕様であるかのごとく言い放っているだけなのか。

だいたい、引数付きのコンストラクタはどうやって使い分けるんだろ。

319 名前:デフォルトの名無しさん :03/11/13 20:35
>>317
それで複数のファイルからそのヘッダ読んだ時
多重定義とならない?
後、クラスのメンバ変数の配列の宣言とかもその定数?でやりたいんだけど。

320 名前:デフォルトの名無しさん :03/11/13 20:37
>>319
const付けてるとならない

321 名前:デフォルトの名無しさん :03/11/13 20:38
>>319
static の文字が見えないのかい?

322 名前:デフォルトの名無しさん :03/11/13 20:38
>>319
じゃあヘッダのにはextern付けて、どっかのcppに一つだけ実体化されるように書けば

323 名前:デフォルトの名無しさん :03/11/13 20:43
>319
static無しの
const int HOGE = 100;
で行けるはずだけど?
ただし浮動小数点定数はヘッダで初期化できないんだっけ?

324 名前:デフォルトの名無しさん :03/11/13 20:46
コンパイラにとってヘッダなんぞ存在しないはずだが。

325 名前:315 :03/11/13 20:49
>>320
ヘッダを複数のファイルで読んでもconst変数だと、怒られませんですた。
どうも失礼しマスタ。

326 名前:デフォルトの名無しさん :03/11/13 20:49
>>311
>S obj(); こうは書けない。

プロトタイプ宣言だな(藁

327 名前:323 :03/11/13 20:53
あー浮動小数点が使えないのはクラス内定数だったっけ。

328 名前:デフォルトの名無しさん :03/11/13 21:04
int i = int();// i = 0に初期化
POD s = POD(); //sは初期化されないまま

329 名前:デフォルトの名無しさん :03/11/13 22:17
それ自体には、ユニークな識別子がないデータがあります。
これを何通りかに並び替えて、さらにその並び順をそれぞれ
記憶しておく必要があるのですが、どういう風に実現するのが一番良いでしょうか?

今はデータに後からIDを振っておいて、並び順はそのIDのみ保存しているのですが
初期化したり、データを削除するたびに大げさな事になりまして…。

330 名前:デフォルトの名無しさん :03/11/13 22:22
>>312
一瞬、>>312 が釣りでもしてるのかと思ったけど、
>>297 をよく読んでみたら確かに >>297 が知ったかぶってアホな事書いてるw

331 名前:デフォルトの名無しさん :03/11/13 22:22
>>329
並び順保持するためのコンテナいくつか作って
データ自体はshared_ptrで共有したら?

332 名前:デフォルトの名無しさん :03/11/13 22:36
>>331
レスありがとうございます。
どちらかというと、データが消えたことをデータを参照している方へ
通知する必要がありまして…逆shared_ptrがあればなぁ。

そしてすいません、大事な所が抜け落ちてました。
並び順をファイルに保存しておく方法でも悩んでいます。
やはりIDを振る方法が、一番得策なのでしょうか?

333 名前:デフォルトの名無しさん :03/11/13 22:45
大法螺吹きは312だぞお前ら。
この問題は7.1で標準準拠になった点、ヘルプにも書いてある。
7.1ではちゃんと初期化される。


334 名前:デフォルトの名無しさん :03/11/13 22:52
>>333
という事はデフォルトコンストラクタは変数は初期化してくれるけど、
初期化用の関数は呼んでくれない(newで動的に確保しなければならない
など)わけだよな。やっぱり明示的に書いた方が良くない?

335 名前:デフォルトの名無しさん :03/11/13 23:00
>>334
初期化用の関数って何?

336 名前:デフォルトの名無しさん :03/11/13 23:02
>>334
>デフォルトコンストラクタは変数は初期化してくれる
>初期化用の関数

意味がさっぱりわかりません。

(初期化用の関数って、もしかしてコンストラクタのことか?)

337 名前:デフォルトの名無しさん :03/11/13 23:15
・コンパイラが提供するデフォルトコンストラクタは、メンバ変数を初期化してくれる。
・ただしあからさまにコンストラクタから明示的に呼び出さなければならない関数
があっても、デフォルトコンストラクタはそれを呼んでくれない。

以上。

338 名前:デフォルトの名無しさん :03/11/13 23:18
>>332
weak_ptr使ったら?
保存するならid振るべきだね。正規化とか勉強したら?

339 名前:デフォルトの名無しさん :03/11/13 23:40
>>338
キーワードありがとうございました。
早速正規化について勉強してみます。ようやく前に進める…。

ID振る方法もベターな様でこちらもホッとしています。

340 名前:デフォルトの名無しさん :03/11/14 00:05
>>337
>ただしあからさまにコンストラクタから明示的に呼び出さなければならない関数

ってなんのことですか?

341 名前:デフォルトの名無しさん :03/11/14 00:21
>>337
せっかく297でPODってキーワードが出てるんだから、調べてみれば?
自分語で説明しようとしても、泥沼にはまっていくばかり。

342 名前:デフォルトの名無しさん :03/11/14 00:27
C++よりまず日本語を

343 名前:デフォルトの名無しさん :03/11/14 00:29
>自分語で説明
>>337のことですね。

344 名前:デフォルトの名無しさん :03/11/14 00:39
>>340
知ってて嫌がらせしてるのが見え見え。

345 名前:デフォルトの名無しさん :03/11/14 01:02
>>344
わからないからきいてるんですけど。
2ちゃんねるだからって穿った見方し過ぎ。

346 名前:デフォルトの名無しさん :03/11/14 01:45
>>333
>>312は大法螺なんて全然吹いてないぞ。よく読んでみろ。どこにホラがある?
で、>>333が正しかったとして(すまんが確かめようがない)>>297は不親切だな。

347 名前:デフォルトの名無しさん :03/11/14 03:48
細かいところは省略して、規格から抜粋。

5.3.4.15

T のオブジェクトを作る new-expression は、オブジェクトを次のように初期化する。
・new-initializer が省略された場合
 ・T が non-POD クラス型(もしくはその配列。cv-修飾子がついてても良い)の場合
  オブジェクトはデフォルト初期化される。
 ・その他の型の場合
  未定義になる。
・new-initializer として () がつけられたら、デフォルト初期化される。

8.5.5

デフォルト初期化は次のような処理である。
・non-POD クラス型の場合、デフォルトコンストラクタが呼ばれる。
・配列の場合は、各要素がデフォルト初期化される。
・それ以外の場合は0で初期化される。

つまり、
・POD クラス型や POD 型なら >>297 は合っている。
・non-POD クラス型なら >>297 は間違っている。

でファイナルアンサー?

348 名前:デフォルトの名無しさん :03/11/14 10:43
>>347
>>297は元々PODについてのみの言及なので、その理屈では間違いじゃないでしょう。
問題(?)なのは、その仕様に沿ってないコンパイラもまだ多くあるので注意、ってことでFA?

349 名前:デフォルトの名無しさん :03/11/14 10:50
> >>297は元々PODについてのみの言及なので、
どこが?

350 名前:デフォルトの名無しさん :03/11/14 13:03
PODふかして急上昇
高く尾を引くヒコーキ雲ねー

351 名前:デフォルトの名無しさん :03/11/14 14:03
POD == Plain Old Data

352 名前:デフォルトの名無しさん :03/11/14 14:15
POD == Perl Old Document

353 名前:デフォルトの名無しさん :03/11/14 14:26
PODの定義って、

・ユーザー定義のコンストラクタ・デストラクタ・代入演算子を持つものは
non-PODである
・non-PODのメンバを持つものはnon-PODである
・non-PODでないものはPODである

こんな感じ?

354 名前:デフォルトの名無しさん :03/11/14 17:11
>>353
・メンバへのポインタはnon-PODである。
・参照はnon-PODである。

ユーザー定義のコンストラクタは持っててもOKだった記憶が。

355 名前:デフォルトの名無しさん :03/11/14 17:41
>>349
一貫してPOD、PODって言ってるじゃん

356 名前:デフォルトの名無しさん :03/11/14 18:02
>>355
「POD class」について確かに言及されているが、それより広い
「PODメンバを持つclass」 についても(間違った)言及をしてるように
読めるのだが。

357 名前:デフォルトの名無しさん :03/11/14 18:03
vectorってeraseしただけじゃメモリ解放されないんですか?
自分で作ったクラスをvector型で定義してるんですけど、
push_backとeraseを繰り返しているうちに使用メモリ量が増えていってるっぽいんですけど・・・

358 名前:デフォルトの名無しさん :03/11/14 18:06
もっと詳しく書いて。
多分あんたのクラスの開放の仕方が悪いだけ。

359 名前:デフォルトの名無しさん :03/11/14 18:19
std::vectorのeraseがメモリを開放しないのはとても有名な話だが、
自作クラスのデストラクタが腐ってる可能性のほうが高そうだな。


360 名前:デフォルトの名無しさん :03/11/14 18:38
VC6のstd::queue::eraseが腐っててこまったことはあるので、
同じ現象かも。環境は?>>357

361 名前:357 :03/11/14 19:27
環境は、
Solaris2.6
gccは2.8.1
です。

InfoクラスとPeerクラスという二つの自作クラスがあります。
Peerクラスの中でInfoクラスをvectorで宣言しています。

Infoクラスではint型を2つ宣言しています。
デストラクタも宣言していますが、中では何も行っていません。

といった感じです・・・


362 名前:デフォルトの名無しさん :03/11/14 20:23
コードさらさなきゃ、何も言えんな。
脳内でSTLのバグってことにしたいなら別だが。

363 名前:デフォルトの名無しさん :03/11/14 20:39
vectorの宣言と、erase周りの数行だけ見てみたいかな

364 名前:デフォルトの名無しさん :03/11/14 20:58
>>359
仕様とバグのクベツワカリマスカ?

365 名前:357 :03/11/14 21:01
これがInfoクラスです

class Info
{
int ip;
int id;

public:

Info();
Info(int p, int d);
~Info();

void set_ip(int p);
void set_id(int d);

int get_ip();
int get_id();
};


366 名前:357 :03/11/14 21:08
これがMobile_peerクラスです。
(さっきはPeerクラスって言いましたけどすいません)

class Mobile_peer
{
Info peer_me; //自分のIPとID

Info peer_parent; //親ピア
vector<Info> peer_child; //子ピア
vector<Info> peer_in_area; //同エリアにいるピア
vector<Info> peer_in_other; //外部から接続してきているピア

          :
          :

てな感じでvectorを宣言してます

367 名前:デフォルトの名無しさん :03/11/14 21:12
なんかinfoがクラスである必然性が薄い気もするが。
それはともかく、swap技法使っても肥大化するのか?

368 名前:357 :03/11/14 21:14
で、Mobile_peerクラスの関数内でデータの追加、削除を行うようにしてます。

void Mobile_peer::set_peer_child(Info info)
{
peer_child.push_back(info);
}

void Mobile_peer::remove_peer_child_by_id(int id)
{
vector<Info> ::iterator p;
p = peer_child.begin();

for(int index = 0; index < peer_child.size(); index++)
{
if(id == peer_child[index].get_id())
{
p += index;
delete *p;
peer_child.erase(p);
break;
}
}
}



369 名前:357 :03/11/14 21:16
>>367
swap技法とは?
すいません、ほんと何も知らないもので・・・

370 名前:デフォルトの名無しさん :03/11/14 21:20
>>369
Effective STL日本版P76を見よ。

371 名前:デフォルトの名無しさん :03/11/14 21:21
>delete *p;

???

372 名前:デフォルトの名無しさん :03/11/14 21:25
具体例を挙げれば、例えば

std::vector<Hoge> v;
v.reserve(10000);

とした時、v.erase()を実行しても予約済みの領域は開放されない。
そこで、
vector<Hoge>(v).swap(v);

とやって、v.capacity()を見てごらん。

373 名前:357 :03/11/14 21:28
>>370
ありがとうございます!

374 名前:357 :03/11/14 21:30
>>371
あ〜それは、そうやれば領域をデリートできるかなと思って書いた行です。
コンパイルできませんでした。

>>372
試してみます。
ありがとうございます

375 名前:デフォルトの名無しさん :03/11/14 21:30
え?swap技法で解決するような問題か?



376 名前:デフォルトの名無しさん :03/11/14 22:03
>>372
すいません。それは何をやってるんですか?

377 名前:デフォルトの名無しさん :03/11/14 22:44
>>376
Effective STL日本語版に詳しく書いてあるのですが、持っておられない
ようなので、簡単に書きます。

std::vector<Hoge>(v) とすると、std::vectorのコピーコンストラクタが呼び
出され、「コピー対象に必要な分だけのメモリ」を割り当てます。この一時
vectorとガラガラに空きがあるvectorを交換すると、vectorは余分な領域が
無くなり、余分な領域は一時vectorの方に移動します。この後一時vector
は破棄され、その時に余分な領域も一緒に消滅します。

378 名前:デフォルトの名無しさん :03/11/14 22:51
>>377
ありがとうございます。すごいですね。

379 名前:デフォルトの名無しさん :03/11/14 22:57
>>378
std::vectorのreserve領域を簡単に削れるメンバ関数がない方が問題。

380 名前:デフォルトの名無しさん :03/11/15 02:56
EUC<->SJIS変換を行うコンパクトなライブラリって何ですか?
iconvはでかいしWindowsに標準で付いて無いので却下。

381 名前:デフォルトの名無しさん :03/11/15 03:00
作れば?
SJIS<->JISの変換は難しくないし
JISの上位ビットを立てればEUCでしょ(半角かな以外)

382 名前:381 :03/11/15 03:06
std::string KanjiCodeConvertor::euc2Sjis(const std::string &str)
{
 BYTE c1, c2 = 0;
 std::string ret(str);
 
 std::string::const_iterator it = str.begin();
 std::string::iterator itDest = ret.begin();

 std::string::const_iterator end = str.end();
 while(it != end)
 {
  c1 = *it++;
  if(c1 < 0x80)
  {
   ++itDest;
   continue;
  }
  else if(it == end)
   break;
  c2 = *it++;
  if(c1 == 0x8E)
  {
   ++itDest;
   continue;
  }
  eucToSjisSub(&c1, &c2);
  *itDest++ = c1;
  *itDest++ = c2;
 }
 return ret;
}

383 名前:380 :03/11/15 03:07
inline void eucToSjisSub(BYTE *kj1, BYTE *kj2)
{
 if (*kj1 & 0x01) {
  *kj1 >>= 1;
  if (*kj1 < 0x6F)
   *kj1 += 0x31;
  else
   *kj1 += 0x71;
  if (*kj2 > 0xDF)
   *kj2 -= 0x60;
  else
   *kj2 -= 0x61;
 } else {
  *kj1 >>= 1;
  if (*kj1 < 0x6F)
   *kj1 += 0x30;
  else
   *kj1 += 0x70;
  *kj2 -= 0x02;
 }
}

384 名前:380 :03/11/15 03:07
一応>>381-382のように自分で書いてみたんですが強烈に重いんです…

385 名前:380 :03/11/15 03:08
×>>381-382
>>382-383

386 名前:デフォルトの名無しさん :03/11/15 03:14
string::iteratorやstring::begin()はかなり重い処理をしていた気がする。
一度vector<char>にコピーしてからやってみては?

387 名前:デフォルトの名無しさん :03/11/15 03:18
あと、細かいことだけど。
BYTE型の変数のアドレスを取って渡してるけど
こうするとレジスタ変数にならなくなる。
もしかしたらシフトしてint1つ渡し、戻り値もintにして、
受け取った側でシフトとマスクで展開した方が速くなるかもしれないよ。

388 名前:デフォルトの名無しさん :03/11/15 03:20
あ、inline指定してあるから
アドレスを受け取るんじゃなくて参照で受け取るなら
コンパイラが最適化してくれるかも。

389 名前:380 :03/11/15 03:38
ありがとうございます。眠いので明日試してみます

390 名前:デフォルトの名無しさん :03/11/15 04:29
c1 = *it++;
  ↓
c1 = *it;
++it;

とか、前置の方がコピー作らなくていいから速いんじゃないの?

391 名前:デフォルトの名無しさん :03/11/15 05:16
BYTE c1, c2 = 0;
std::vector<char> ret;
ret.reserve(str.length());// SJIS->EUCなら2倍確保
const char *it = str.c_str();
const char *end = it + str.length();
char *itDest = &ret[0];
// 中略
return std::string(&ret[0], itDest - &ret[0]);

こうするだけで全然違うと思う。
ただ、このままだと「現実的に問題になる実装はないけど、厳密には未定義」な動作になる。
速度最優先ならこのまま、規格厳守なら
reserve()->resize(), c_str()->vector+copy()+begin()等の修正を。

392 名前:デフォルトの名無しさん :03/11/15 06:11
そこまでして string をメリットってあるかな。
char 配列でいいじゃん。

393 名前:デフォルトの名無しさん :03/11/15 08:46
>>380
http://tricklib.com/cxx/ex/babel/

そのまま使うとデカイので参考までに。
>>383 の処理だけではちゃんと変換できない部分を
正しく変換する為に変換テーブルが使用されています。

394 名前:デフォルトの名無しさん :03/11/15 09:33
for(it = v.begin(); it != v.end(); ++it)

とかする場合の前置++。
みなさんはint等の組み込み型も前置に統一してますか?

395 名前:デフォルトの名無しさん :03/11/15 10:07
>>394
統一しない理由がないので統一してます。

396 名前:デフォルトの名無しさん :03/11/15 11:03
統一しない理由が無いので統一してません。

397 名前:デフォルトの名無しさん :03/11/15 11:26
>>392
例外安全にならないんで

398 名前:デフォルトの名無しさん :03/11/15 12:40
>>394
operatorなら当然前置だが
ポインタの++が前置になってるの見ると違和感を覚える
アセンブラっぽい考え方してると、そんなのねえよって

399 名前:デフォルトの名無しさん :03/11/15 13:08
>>398
> アセンブラっぽい考え方してると、そんなのねえよって
PDP-11 のアセンブラに従って,インクリメントは後置,デクリメントは前置で統一してるのか?


400 名前:デフォルトの名無しさん :03/11/15 14:07
>>397
そんなことはねぇぞ。

401 名前:デフォルトの名無しさん :03/11/15 15:48
なんかこのスレ最近俺C言語スレに似てきたな。。。

402 名前:デフォルトの名無しさん :03/11/15 16:45
>>401
C++は母胎がCだからしょうがない。でもC++独特の話題にしたいねえ。

403 名前:デフォルトの名無しさん :03/11/15 19:25
静的変数を使用するとき、staticメンバ変数を使うのと、
無名namespaceのファイルスコープ変数を使うのと、どっちがいいだろう?

どうせgetter/setter経由でしかアクセスしないから、staticメンバにしても無名namespace内に置いても外側からの見た目は変わらないのよ。
んで、
staticにすることのメリット=クラスとの関連付けが明確。
デメリット=クラスの定義内に書かないといけないのでヘッダに余計な依存が発生する&宣言と定義が分離される。
無名namespaceにすることのメリット、デメリット=上の逆。

404 名前:デフォルトの名無しさん :03/11/15 19:55
そのまんまじゃん。何を悩む必要があるのか

405 名前:デフォルトの名無しさん :03/11/15 20:22
>どうせgetter/setter経由でしかアクセスしないから

あまいんだよ

406 名前:デフォルトの名無しさん :03/11/15 20:24
>>398
vectorのiteratorみたいに、ほとんどの実装でポインタだけど、
規格上はポインタとは限らない、って場合はどうするんですか?

407 名前:デフォルトの名無しさん :03/11/15 23:42
signal と throw について悩んでおります。

現在、ソケット通信の受信クラスを作成していまして、タイムアウト処理を実装しようとしています。
とりあえず、alarm で時間分経過したら signal で関数を呼び出し、その中で処理をしようとしています。
自分としては、その後に色々と例外処理をしようとしたので throw を使おうとしているのですが、
なぜか throw した時点でアボートしてしまいます。
幾つか試作の関数も作成して見ましたが、どれもうまくいかないようです。
signal で呼び出した関数内では、throw は使えないのでしょうか?

408 名前:デフォルトの名無しさん :03/11/15 23:54
特殊な理由でもない限り、
そのクラスが持ってるものは
そのクラス内で定義した方がいいよ。
無名 namespace にしたら、
インライン関数からアクセスしたいときに
アクセスできなくなっちゃうよ。

409 名前:デフォルトの名無しさん :03/11/16 00:14
>>407
そのsignalで呼び出された関数は、別スレッドだったりしますか?

410 名前:デフォルトの名無しさん :03/11/16 01:10
vector< int >v;
for(int i=0 ; i<100 ; i++)v.push_back(i*i);
vector< int >::iterator it;
for(it=v.begin() ; it!=v.end() ; ++it ) // or it++
{
printf( "test:%d\n" , *it );
}
-------------------
とりあえず、for loopのイレテータを ++it にしても it++ にしても
全く同じバイナリが出た。




411 名前:↑ちなみに :03/11/16 01:18
環境は、cygwin(NT^5.1 1.3.17) でgcc 3.2.20020927
おそらくgcc環境なら、全く同じコード吐き出すんでないかなー?
多分、vc++もこの程度なら、最適化を期待して構わないんでは?
手元にvc++がないので確かめられないですがー


412 名前:デフォルトの名無しさん :03/11/16 01:25
>>411
その環境だと vector<T>::iterator は T* だから,差がないんじゃないの?
list や deque で追試よろしく.

413 名前:デフォルトの名無しさん :03/11/16 01:42
>>412
差が出ても出なくっても、++itのほうが有利なのは確実なので、
それ以上調べても意味無いと思う。

414 名前:list版 :03/11/16 02:31
679,688c679,687
< 6e6:89 45 d8 mov %eax,0xffffffd8(%ebp)
< 6e9:83 c4 10 add $0x10,%esp
< 6ec:8b 10 mov (%eax),%edx
< 6ee:8b 45 e8 mov 0xffffffe8(%ebp),%eax
< 6f1:89 55 c8 mov %edx,0xffffffc8(%ebp)
< 6f4:89 45 d8 mov %eax,0xffffffd8(%ebp)
< 6f7:39 c2 cmp %eax,%edx
< 6f9:75 d5 jne 6d0 <hoge+0xa0>
< 6fb:eb b3 jmp 6b0 <hoge+0x80>
< 6fd:8d 76 00 lea 0x0(%esi),%esi
---
> 6e6:83 c4 10 add $0x10,%esp
> 6e9:8b 10 mov (%eax),%edx
> 6eb:8b 45 e8 mov 0xffffffe8(%ebp),%eax
> 6ee:89 55 c8 mov %edx,0xffffffc8(%ebp)
> 6f1:89 45 d8 mov %eax,0xffffffd8(%ebp)
> 6f4:39 c2 cmp %eax,%edx
> 6f6:75 d8 jne 6d0 <hoge+0xa0>
> 6f8:eb b6 jmp 6b0 <hoge+0x80>
> 6fa:8d b6 00 00 00 00 lea 0x0(%esi),%esi

上が it++ 下が it--


415 名前:デフォルトの名無しさん :03/11/16 02:36
413 が言うように for 内のインクリなら ++it が確実なんだけど
for外で it のインクリをすることもある。

foo = *it++;
foo = *++it;

の両方のケースに遭遇する可能性があるのだけど、
この場合、どちらもコードの質に変化がないということは
何かの役に立つと思う。

少なくとも EffecitiveSTL に書かれてるような危惧は見当たらない。
つまり、実体が作成されてからコピーされるから性能に変化がある
うんぬんは、実際にダンプしてみると心配に値するtipsでもないということ。


416 名前:あ、 :03/11/16 02:38
×上が it++ 下が it--
○上が it++ 下が ++it



417 名前:デフォルトの名無しさん :03/11/16 02:42
VC7.1 /Ox

for(it=v.begin() ; it!=v.end() ; ++it ) // or it++
00415026 mov eax,dword ptr [ebp-1Ch]
00415029 mov dword ptr [ebp-64h],eax
0041502C mov ecx,dword ptr [ebp-64h]
0041502F mov dword ptr [ebp-3Ch],ecx
00415032 mov edx,dword ptr [ebp-3Ch]
00415035 mov dword ptr [it],edx
00415038 jmp main+93h (415043h)
0041503A mov eax,dword ptr [it]
0041503D add eax,4
00415040 mov dword ptr [it],eax
00415043 mov ecx,dword ptr [ebp-18h]
00415046 mov dword ptr [ebp-68h],ecx
00415049 mov edx,dword ptr [ebp-68h]
0041504C mov dword ptr [ebp-40h],edx
0041504F mov eax,dword ptr [it]
00415052 sub eax,dword ptr [ebp-40h]
00415055 neg eax
00415057 sbb eax,eax
00415059 inc eax
0041505A movzx ecx,al
0041505D neg ecx
0041505F sbb ecx,ecx
00415061 inc ecx
00415062 movzx edx,cl
00415065 test edx,edx
00415067 je main+0CEh (41507Eh)

418 名前:デフォルトの名無しさん :03/11/16 02:43
for(it=v.begin() ; it!=v.end() ; it++ ) // or it++
0041507E mov edx,dword ptr [ebp-1Ch]
00415081 mov dword ptr [ebp-6Ch],edx
00415084 mov eax,dword ptr [ebp-6Ch]
00415087 mov dword ptr [ebp-44h],eax
0041508A mov ecx,dword ptr [ebp-44h]
0041508D mov dword ptr [it],ecx
00415090 jmp main+0F7h (4150A7h)
00415092 mov edx,dword ptr [it]
00415095 mov dword ptr [ebp-74h],edx
00415098 mov eax,dword ptr [it]
0041509B add eax,4
0041509E mov dword ptr [it],eax
004150A1 mov ecx,dword ptr [ebp-74h]
004150A4 mov dword ptr [ebp-48h],ecx
004150A7 mov edx,dword ptr [ebp-18h]
004150AA mov dword ptr [ebp-7Ch],edx
004150AD mov eax,dword ptr [ebp-7Ch]
004150B0 mov dword ptr [ebp-4Ch],eax
004150B3 mov ecx,dword ptr [it]
004150B6 sub ecx,dword ptr [ebp-4Ch]
004150B9 neg ecx
004150BB sbb ecx,ecx
004150BD inc ecx
004150BE movzx edx,cl
004150C1 neg edx
004150C3 sbb edx,edx
004150C5 inc edx
004150C6 movzx eax,dl
004150C9 test eax,eax
004150CB je main+132h (4150E2h)

419 名前:デフォルトの名無しさん :03/11/16 02:45
STLのスレってどこですか?


420 名前:デフォルトの名無しさん :03/11/16 02:45
VC7.1 list /Ox

for(it=v.begin() ; it!=v.end() ; ++it ) // or it++
004142D7 mov eax,dword ptr [ebp-18h]
004142DA mov dword ptr [ebp-5Ch],eax
004142DD mov ecx,dword ptr [ebp-5Ch]
004142E0 mov edx,dword ptr [ecx]
004142E2 mov dword ptr [ebp-60h],edx
004142E5 mov eax,dword ptr [ebp-60h]
004142E8 mov dword ptr [ebp-38h],eax
004142EB mov ecx,dword ptr [ebp-38h]
004142EE mov dword ptr [it],ecx
004142F1 jmp main+0ABh (4142FBh)
004142F3 mov edx,dword ptr [it]
004142F6 mov eax,dword ptr [edx]
004142F8 mov dword ptr [it],eax
004142FB mov ecx,dword ptr [ebp-18h]
004142FE mov dword ptr [ebp-64h],ecx
00414301 mov edx,dword ptr [ebp-64h]
00414304 mov dword ptr [ebp-3Ch],edx
00414307 mov eax,dword ptr [it]
0041430A sub eax,dword ptr [ebp-3Ch]
0041430D neg eax
0041430F sbb eax,eax
00414311 inc eax
00414312 movzx ecx,al
00414315 neg ecx
00414317 sbb ecx,ecx
00414319 inc ecx
0041431A movzx edx,cl
0041431D test edx,edx
0041431F je main+0E7h (414337h)

421 名前:デフォルトの名無しさん :03/11/16 02:47
for(it=v.begin() ; it!=v.end() ; it++ ) // or it++
00414337 mov edx,dword ptr [ebp-18h]
0041433A mov dword ptr [ebp-68h],edx
0041433D mov eax,dword ptr [ebp-68h]
00414340 mov ecx,dword ptr [eax]
00414342 mov dword ptr [ebp-6Ch],ecx
00414345 mov edx,dword ptr [ebp-6Ch]
00414348 mov dword ptr [ebp-40h],edx
0041434B mov eax,dword ptr [ebp-40h]
0041434E mov dword ptr [it],eax
00414351 jmp main+117h (414367h)
00414353 mov ecx,dword ptr [it]
00414356 mov dword ptr [ebp-74h],ecx
00414359 mov edx,dword ptr [it]
0041435C mov eax,dword ptr [edx]
0041435E mov dword ptr [it],eax
00414361 mov ecx,dword ptr [ebp-74h]
00414364 mov dword ptr [ebp-44h],ecx
00414367 mov edx,dword ptr [ebp-18h]
0041436A mov dword ptr [ebp-7Ch],edx
0041436D mov eax,dword ptr [ebp-7Ch]
00414370 mov dword ptr [ebp-48h],eax
00414373 mov ecx,dword ptr [it]
00414376 sub ecx,dword ptr [ebp-48h]
00414379 neg ecx

422 名前:デフォルトの名無しさん :03/11/16 02:47
0041437B sbb ecx,ecx
0041437D inc ecx
0041437E movzx edx,cl
00414381 neg edx
00414383 sbb edx,edx
00414385 inc edx
00414386 movzx eax,dl
00414389 test eax,eax
0041438B je main+153h (4143A3h)

423 名前:デフォルトの名無しさん :03/11/16 02:49
>>419
【C++】template 統合スレ -- Part3
http://pc2.2ch.net/test/read.cgi/tech/1066493064/

統合しすぎてもはやSTLの話題はほとんどないが。この際分離したら。

424 名前:デフォルトの名無しさん :03/11/16 02:49
リスティングうざい。
時間測れ。それが一番だ。

425 名前:デフォルトの名無しさん :03/11/16 02:59
どっちにしても言語スレでやることじゃねぇ

426 名前:デフォルトの名無しさん :03/11/16 03:05
++it と it++ とでカウンターに使ってるレジスタが変化しているものの、
大差ないですね・・・ >>vc7.1

結論は、後置・前置、大差なし。
for()の中であれば、確実な前置を使うべきだが、
その他の場合は、その状況に有利な選択をしても構わないかと。

427 名前:デフォルトの名無しさん :03/11/16 03:08
>>どっちにしても言語スレでやることじゃねぇ
そうムキに分類しなくても良いではないですか?
STLはC++の公式かつ標準ライブラリである以上、言語スレでもOKかと。


428 名前:デフォルトの名無しさん :03/11/16 03:08
>>424>>425
正直、すまんかった。
>>426
最適化するとVC7.1はいろいろやってくれるようだ。ループのアンロール
もしてくれる事がある。その時はBCCと4倍ほどの時間の差が出た。
BCCを手動でアンロールしたらほとんど差がなくなった。

429 名前:デフォルトの名無しさん :03/11/16 03:25
> for()の中であれば、確実な前置を使うべきだが、
> その他の場合は、その状況に有利な選択をしても構わないかと。
どんな場合でも「その状況に有利な選択」をするもんだ。

430 名前:デフォルトの名無しさん :03/11/16 03:59
前置と後置で意味の変わる文は
慣れてる人は別に気にならんけど、
分からん人はパッと見で理解できんので、
そういう文は俺は書かんな。
そういうわけで常に単独で書くから
前置と後置を使い分ける必要がなく、
いつも前置で統一している。

431 名前:デフォルトの名無しさん :03/11/16 04:30
>>413

確実という根拠を得るには調べることが必要と違うのか?
現に412の調査では++itがit++よりも有利ではないという結果を得ている。
つまり412はキミの言う説にあてはまらない環境を現認しているわけだが
そのうえでのキミの発言は非科学的と言わざるを得まい。

432 名前:413 :03/11/16 04:42
>>431
後置インクリメントは本質的にコピーが必要なのだから、
効率的な利点を見れば常に 前置>=後置 になる。
「++itのほうが有利」ってのは、特定の環境に依らずに
こういうことが言えるって事。

前置<後置 になるようなケースを示してくれるってんなら、それは興味深い。

433 名前:デフォルトの名無しさん :03/11/16 04:44
>>431
「有利ではない」≠「不利である」
「有利ではない」は「等価」を含むのだよ。

前置 ++ のオーバーロードで意図的に無茶苦茶重い処理を入れない限り、
原理的に考えて有利性は ++it ≧ it++ だろ。
いくら最適化が効いてもせいぜいイコールだ(それが >>412 の例だ)。
そして、その最適化はコンパイラによってまちまち。
なら ++it の方が有利と結論付けるのは当たり前だろ。

434 名前:デフォルトの名無しさん :03/11/16 05:32
前置と後置のどちらが有利かなんて
コンパイラによる。
議論するだけ無駄。

435 名前:デフォルトの名無しさん :03/11/16 05:35
>>434
頭悪い人がわざわざ締めに来なくていいですw

436 名前:デフォルトの名無しさん :03/11/16 05:48
>>433
先に言ってりゃまだよかったんだよ

437 名前:デフォルトの名無しさん :03/11/16 06:01
>>436
はあ?

438 名前:デフォルトの名無しさん :03/11/16 06:10
朝っぱらから煽りあいとはおめでてーな

439 名前:デフォルトの名無しさん :03/11/16 06:16
>>436
日本語が不自由な方のようですね。
どうぞ無理せず母国の掲示板で議論を続けてください。

440 名前:デフォルトの名無しさん :03/11/16 07:06
>>434
前置>=後置


441 名前:デフォルトの名無しさん :03/11/16 07:20
まぁ、C ならよほどヘボいコンパイラ使わない限り等価だろうけどね。
いかんせんここは C++ スレだから演算子のオーバーロードが...。

442 名前:デフォルトの名無しさん :03/11/16 07:56
そもそも、「++it;orit++;」だけの場合
インラインなのだから前置も後置も変わらないだろう。

443 名前:デフォルトの名無しさん :03/11/16 08:40
前置>=後置 


という簡素な結論が出てなおグタグタ逝ってるヤシは
頭がピンボケてる。
そういう人はちょっとだけ、冷静天秤を買うのだ。


444 名前:デフォルトの名無しさん :03/11/16 09:51
おまえモナ♥

445 名前:デフォルトの名無しさん :03/11/16 11:23
ここは純粋なC++について語るスレなので、
イテレータのインクリメント等機種依存・実装依存・環境依存の話がしたければこちらでどうぞ。

【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1067189450/

446 名前:デフォルトの名無しさん :03/11/16 11:58
インクリメントは機種依存なのか。
仕様上は後置インクリメントではコピーが生成されるので
特に理由の無い限りは前置が望ましいと言う結論を出すのも、依存の話題なのか?

447 名前:デフォルトの名無しさん :03/11/16 12:05
>>446
どういう風にコンパイルされるかは環境依存。
前置≧後置 になることが、規格で決まっているわけじゃない。

448 名前:デフォルトの名無しさん :03/11/16 12:15
>>447
後置はコピーが生成される分要求が多いので
論理的に前置≧後置だとしか思えないが・・

要求が多くてもそれにマッチした機能を持つハードウェアだと速くなるとかあるから
速度についてはもちろん実装依存だが。

449 名前:デフォルトの名無しさん :03/11/16 12:25
>>448
コピーが生成される方が遅い ←これが環境依存なんでしょ

450 名前:デフォルトの名無しさん :03/11/16 12:25
ごめん、あとの2行読んでなかった。。。

451 名前:デフォルトの名無しさん :03/11/16 12:26
文脈的にコピーを生成する必要がないと判断すれば生成しないのが普通だが、
かといってそれを期待しすぎるのもどうよ、ぐらいだと思うが。

452 名前:デフォルトの名無しさん :03/11/16 12:41
はっきりしているのは、++i が i++ より優速なのはたしかだけど、
プログラム中での時間の差は、掲示板に投稿するのにかかる時間や、
他の連中を説伏するのにかかる時間よりずーっと短いので、
結局どーでもいい、ってことさ。

453 名前:デフォルトの名無しさん :03/11/16 12:46
フレームバッファを弄繰り回すループでも
その速度差は重要ではないのか。
結局はケースバイケースだろ
どーでもいいなんて切り捨てられる問題でもない

454 名前:デフォルトの名無しさん :03/11/16 12:47
>>447
コンパイル結果は確かに環境依存で否定の仕様も無いが
結局はすべてのプログラムがいずれかの環境に依存するんだから
それもある程度考慮した上で望ましいスタイルを模索するのは
本ヌレの範疇じゃないのか?

455 名前:デフォルトの名無しさん :03/11/16 12:47
80-20の法則を忘れてはいかんな。
++iとi++の違いが重要になるようなフレームバッファの弄くり方って何だよ?

456 名前:デフォルトの名無しさん :03/11/16 13:00
>>452
どーでも良くないアプリ書いたことないって正直に言いな

457 名前:デフォルトの名無しさん :03/11/16 13:00
トリプルバッファ
1280(W)*960(H)*85(R)*3(B)=313344000/s
これくらいの頻度のインクリメントなら差も出ると思うが。

458 名前:デフォルトの名無しさん :03/11/16 13:06
planはそれ自体が正しくてもdoとseeが続かなければ机上の空論。
実装依存をネガティブなキーワードに使っている風潮が見られるが
そういうあんたらは、どこの実装で良い結果が得たいんだ?
無目的な者ほど不毛な抽象論しかすることがないわけだが。

459 名前:デフォルトの名無しさん :03/11/16 13:08
メモリが律速するって。それともなにか、最近のメモリは
1280(w)*960(h)*85(r)*4(c)*3(tri)=1.2GB/sくらい楽々ですか。

460 名前:デフォルトの名無しさん :03/11/16 13:09
ここは純粋なC++について語るスレなので、
イテレータのインクリメント等機種依存・実装依存・環境依存の話がしたければこちらでどうぞ。

【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1067189450/

461 名前:デフォルトの名無しさん :03/11/16 13:10
来年の今ごろはその1.5倍くらいじゃないか?

462 名前:デフォルトの名無しさん :03/11/16 13:18
あと、457の回数は、4で割るべきだと思う。

463 名前:デフォルトの名無しさん :03/11/16 13:20
ここは純粋なC++について語るスレなので、
イテレータのインクリメント等機種依存・実装依存・環境依存の話がしたければこちらでどうぞ。

【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1067189450/

464 名前:デフォルトの名無しさん :03/11/16 14:20
>>458
新生のヴァカ ?

> 実装依存をネガティブなキーワードに使っている風潮が見られるが

どこにそんな風潮が見られるんだ ? お得意のデムパか ?

実行速度の話は、実装依存。
ここは、実装依存の話をするスレじゃない。

ただそれだけ。

465 名前:デフォルトの名無しさん :03/11/16 14:30
お得意の、ほとぼりが冷めてから突然ぶり返し煽りキター

466 名前:デフォルトの名無しさん :03/11/16 14:34
前置/後置なんてのはC言語スレにまかせよう:-)

467 名前:デフォルトの名無しさん :03/11/16 14:34
>>432
> 前置<後置 になるようなケースを示してくれるってんなら、それは興味深い。
まあx,

x = i, ++i;
x = i++;

どっちが書きやすいか,という程度の話だと思うよ.

468 名前:デフォルトの名無しさん :03/11/16 14:36
>>466
演算子を再定義できない言語だと,それこそ「環境依存」で終わりなんだが.


469 名前:デフォルトの名無しさん :03/11/16 14:42
ここは純粋なC++について語るスレなので、
イテレータのインクリメント等機種依存・実装依存・環境依存の話がしたければこちらでどうぞ。

【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1067189450/

470 名前:デフォルトの名無しさん :03/11/16 16:27
>>469
お前いい加減ウザイ

471 名前:デフォルトの名無しさん :03/11/16 17:49
>>464

>実行速度の話は、実装依存。
まあそうだが


だからといって
>ここは、実装依存の話をするスレじゃない。

これは変だろう

C++を選択する理由の中に
速度やらワーキングセットやらは
成果物の性能を実測する前に出てくる

間違いなくC++は性能を意識して使うものだ

割と色々な環境で同じ実験ができる題材について
実測結果や考察を発表しあうことまで
スレ違いと言って排除するのには反対だ

VCしか使っとらん者がgccでの測定値に難癖つけるような
ヘボい考察さえ締め出せれば十分だと思う

472 名前:デフォルトの名無しさん :03/11/16 19:55
分割コンパイルについての質問です。
Cpad for Borland C++Compiler を使っています。

例えば

#include <iostream.h>

int func(int x);

void main(void)
{
int x;
cin>>x;

int y=func(x);
cout<<y;
}

int func (int x)
{
return x*x;
}

これを分割コンパイルするには

473 名前:デフォルトの名無しさん :03/11/16 19:55
(1) func.h ファイル
int func(int x);

(2) func.cpp ファイル
#include <iostream.h>
#include "func.h"
int func(int x)
{
return x*x;
}

(3) main.cpp ファイル
#include "func.h"
void main(void)
{
int x;
cin>>x;

int y=func(x);
cout<<y;
}

をそれぞれ作成して、(3)をコンパイルする、のではダメなようなのですが
どのようにすれば正常に分割コンパイル出来るのかよくわかりません。
他にどういう作業を行えばよいのでしょうか。

474 名前:デフォルトの名無しさん :03/11/16 19:59
bcc32 main.cpp func.cpp

しかし、これでは面倒見がよすぎて
リンク絡みでエラーこいたときの
対応力がつかない


475 名前:413 :03/11/16 20:31
>>467
あー。
書き込んだ後にそう読み違える人がいるかと思ったけど、
まぁいいか、と思って放っておいた。ごめん。

> 前置<後置 になるようなケースを示してくれるってんなら、それは興味深い。
↑ここにも「効率的な利点を見れば」がかかってる。

476 名前:413 :03/11/16 20:46
> 割と色々な環境で同じ実験ができる題材について
> 実測結果や考察を発表しあうことまで

「コピーする必要がある」ものと、
「コピーする必要が無い」ものを比べるのに、
実測結果など不要だと思う。
不要な実測結果を以って本質を霞ませるのも歓迎できない。

静的確保で済むところを動的確保で置き換えることは大抵の場合可能だが、
ベンチマークを取った結果、
「なんと、ほぼ等速だ。最近のヒープ管理は賢いねぇ。」
だったとしても、無駄な動的確保を容認する根拠にはならない。

477 名前:デフォルトの名無しさん :03/11/16 21:14
>>476
> 無駄な動的確保を容認する根拠にはならない。
それは極論だろう.ホントに等速で,断片化などの問題も完全に回避できるなら
許容するって.

478 名前:デフォルトの名無しさん :03/11/16 21:25
問題は多くの環境で、どうなるかだ

479 名前:413 :03/11/16 21:26
>>477
だからどうした?例え話にだけ突っ込むなよ。

本質を見て判断すれば問題ないのに、
見極めが面倒で局所的な条件をつけて「容認できる」と主張することに
何の価値があるというのか。

480 名前:デフォルトの名無しさん :03/11/16 21:58
ここのところ、毎週日曜に必ず論争が起きるな
同じ人達なんだろうか

481 名前:デフォルトの名無しさん :03/11/16 22:46
>不要な実測結果
^^^^^^
イタタタ

482 名前:デフォルトの名無しさん :03/11/17 00:14
>>464
> ここは、実装依存の話をするスレじゃない。

嘘つくなよ。Cスレじゃあるまいし。

483 名前:デフォルトの名無しさん :03/11/17 00:20
ここは純粋なC++について語るスレなので、
イテレータのインクリメント等機種依存・実装依存・環境依存の話がしたければこちらでどうぞ。

【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1067189450/

484 名前:デフォルトの名無しさん :03/11/17 00:44
純粋なC++についてのみ語るとしたら
後置はコピーが作成されることになっているので遅い。

485 名前:デフォルトの名無しさん :03/11/17 01:12
>>483
しつこいうるせーだまれ

486 名前:デフォルトの名無しさん :03/11/17 02:28
まだやってんの?

487 名前:デフォルトの名無しさん :03/11/17 02:33
>>486
そのようです。
C++厨の頭の悪さがこれでもかというほど出ていて、正直まいりますよねw

488 名前:デフォルトの名無しさん :03/11/17 08:08
↑ナニコイツ?本物の池沼だな

489 名前:デフォルトの名無しさん :03/11/17 09:53
>>488
よくそんなストレートに悔しがれますね。
つくづく頭が悪いなぁw

490 名前:デフォルトの名無しさん :03/11/17 18:57
typedef int HOGE;

try {
 throw static_cast<HOGE>(10);
}
catch(int)
{
  cout << "exception" << endl;
}

これで例外をキャッチしてしまうのはC++の仕様でしょうか?
それともVC++6.0だけでしょうか?

491 名前:デフォルトの名無しさん :03/11/17 19:03
C++の仕様。

C++ の typedef は「弱いtypedef」だから、
throw static_cast<HOGE>(10); と throw static_cast<int>(10); とか、
catch(int) と catch(HOGE) とかは寸分違わず全く同じ意味だ。

492 名前:デフォルトの名無しさん :03/11/17 19:07
強いtypedefってものがあるなら、
それはまったく別の型とみなされるんですか?

493 名前:デフォルトの名無しさん :03/11/17 19:12
>>492
んです。
Dがそう。

494 名前:デフォルトの名無しさん :03/11/17 19:42
struct HOGE { int value;}


495 名前:デフォルトの名無しさん :03/11/17 20:33
template <typename Src> class Strong_typedef;

496 名前:デフォルトの名無しさん :03/11/17 21:26
>>493
Dってなに?

497 名前:デフォルトの名無しさん :03/11/17 21:27
>>496
http://www.digitalmars.com/d/

498 名前:デフォルトの名無しさん :03/11/17 21:29
み、みんな、わりーな。おいらが、最初に前置・後置の疑問を
提示してしまったばかりに、スレが荒れてしまって。

というか、まさか、こんな些細な疑問が、こんなに荒れると
思わんかったよ

499 名前:デフォルトの名無しさん :03/11/17 21:56
謝って済めばFOX ★はいらねぇ

500 名前:デフォルトの名無しさん :03/11/17 22:34
>>498
蒸し返すな。どうせ荒れが収まってつまらなくなったんだろ。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.