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


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

C++相談室 part23
501 名前:デフォルトの名無しさん :03/09/27 07:24
>>490
氏ね

502 名前:デフォルトの名無しさん :03/09/27 10:40
お前らまとめてスレ違い。
って、漏れもか。

503 名前:デフォルトの名無しさん :03/09/27 11:19
学生で赤版買って使ってます。卒業してからも
しばらく使うつもりですが、伺か?

504 名前:デフォルトの名無しさん :03/09/27 12:36
>>494
なんでてめぇにピーコしてやらなきゃならねぇんだよ。

505 名前:デフォルトの名無しさん :03/09/27 13:26
>>494
割れ廚は氏ね。
取り敢えず板違いだと忠告しておく。ダウソ板に(・∀・)カエレ!

506 名前:490 :03/09/27 15:56
プログラム板全体に言えることだけど
あからさまのネタに対する食いつきっぷりがいいね
オサーンばっかりなのか?wwwwwwwwww

507 名前:デフォルトの名無しさん :03/09/27 16:10
>>506
いいから氏ねって。
お前なんか社会から必要とされてないだろ?
邪魔なだけなんだから、今すぐ回線切って首吊って氏ねよ。

508 名前:デフォルトの名無しさん :03/09/27 16:42
>>506
プログラムをなりわいとする俺に取っては割れ廚はホントに氏んで
欲しいの一心。

509 名前:デフォルトの名無しさん :03/09/27 17:46
>490
ハートマン軍曹も知らないようでは、ネタ師として3流だヨ

510 名前:デフォルトの名無しさん :03/09/27 18:06
相手にしても何も生み出さないのでスルーしようよ

511 名前: ◆TJ9qoWuqvA :03/09/27 18:35
この板、年齢層って何ぼよ

512 名前:デフォルトの名無しさん :03/09/27 18:36
>490
MSDN Library?

513 名前:デフォルトの名無しさん :03/09/27 18:56
クリティカルなパフォーマンスが要求され、
高速にインスタンスを取得する必要がある場合、シングルトンよりもグローバル変数の方が高速ですか?

514 名前:デフォルトの名無しさん :03/09/27 19:03
>>513
アセンブラで書け。

515 名前:デフォルトの名無しさん :03/09/27 19:33
グローバル変数もシングルトンの一実装なんだが。
そうでなくてもインスタンス取得するメソッドをinlineにしとけば実質同じ。

516 名前:490 :03/09/27 19:34
>>507
定番だね。つまらない

>>508
おまいの糞アプリなんて誰も金出して買わないよ

>>512
そう、それがほしい。今すぐ流して


517 名前:デフォルトの名無しさん :03/09/27 19:38
>516
今下水に流してきました

518 名前:デフォルトの名無しさん :03/09/27 19:44
>>515
inline hoge& getInstance()
{
 if(instance == NULL)
  instance = new hoge();
 retrun instance;
}


これの分遅くなるんじゃないの?
if(instance == NULL)

519 名前:デフォルトの名無しさん :03/09/27 19:45
×inline hoge& getInstance()
○inline static hoge& getInstance()

520 名前:デフォルトの名無しさん :03/09/27 19:49
>>518
関数内static変数にしておいても
コンパイラが同じようなコード吐くしな。

521 名前:デフォルトの名無しさん :03/09/27 20:01
>>518
それと、グローバル変数だとリンク時にアドレスが確定するが、実行時に new
すると実行時までアドレスが確定しないので、間接参照一回分のペナルティが
発生する。

といっても、それが問題になることなど、現実にはまず無いと思うが。

522 名前:デフォルトの名無しさん :03/09/27 20:15
つーか、どーしても速度が必要ならローカル変数に取っておくだろ

523 名前:デフォルトの名無しさん :03/09/27 20:18
プログラムって難しいね

524 名前:デフォルトの名無しさん :03/09/27 20:34
>>516
釣り必死だな( ´,_ゝ`)プッ

525 名前:デフォルトの名無しさん :03/09/27 20:39
>>516
通報しますた。二週間後をお楽しみに。

526 名前:デフォルトの名無しさん :03/09/27 21:06
C/C++の考え方の伝統では何事も実行時決定よりもコンパイル時決定が良いっていうのが
Effective C++とかにも書いてあるけど、
最近のオブジェクト指向の考え方って実行時決定寄りだよね?デザインパターン本とか読むと。
そのへんみんなどう思ってるの。

527 名前:デフォルトの名無しさん :03/09/27 21:18
C++にもRTTIあるだろ

528 名前:デフォルトの名無しさん :03/09/27 21:18
テスト環境が問題なく確立できるなら実行時寄りになっても
痛くないってことじゃないですかね?

C/C++では、テストがうまく動かせない環境が多いから、
コンパイル時決定を重視するべきだと思ってます。

529 名前:デフォルトの名無しさん :03/09/27 21:21
cppunitあるだろ

530 名前:デフォルトの名無しさん :03/09/27 21:23
あれってクロス環境で使えるの?

531 名前:デフォルトの名無しさん :03/09/27 21:30
コンパイル時決定だとパフォーマンスが良い

532 名前:デフォルトの名無しさん :03/09/27 21:32
>>531
うそぉ〜・・・・

533 名前:デフォルトの名無しさん :03/09/27 21:35
C++の実行時はヘタクソ

534 名前:デフォルトの名無しさん :03/09/27 21:41
>>532
え?良くないの?

535 名前:デフォルトの名無しさん :03/09/27 21:43
virtualやデリファレンス分だけ遅いって話だろ。

536 名前:デフォルトの名無しさん :03/09/27 21:57
コンパイル時決定だと階乗計算とか速いよね。

537 名前:デフォルトの名無しさん :03/09/27 22:32
>>530
オリジナルの CppUnit はやや辛いが、CppUnit-x だとホスト環境に対する要求が
軽めだから、ちょっといじってやれば大抵の環境で使えるよ。

538 名前:デフォルトの名無しさん :03/09/27 22:36
> 最近のオブジェクト指向の考え方って実行時決定寄りだよね?デザインパターン本とか読むと。
すんごい誤読だと思う。

539 名前:デフォルトの名無しさん :03/09/27 22:47
そう?どの辺が?

540 名前:デフォルトの名無しさん :03/09/27 22:50
そもそもデザインパターンは最近か?

541 名前:デフォルトの名無しさん :03/09/27 22:56
まあ最近かどうかは譲ってもいいよ

542 名前:デフォルトの名無しさん :03/09/27 23:02
というか文法やライブラリであっさり実装できたらデザパタにならないだろ。
C++で直接記述しにくいものが(特に生成系)デザパタになったんだろ。

543 名前:デフォルトの名無しさん :03/09/27 23:43
>>516
氏ね。

544 名前:デフォルトの名無しさん :03/09/28 02:53
型情報は未だに自前の変なマクロで実装してます・・・。
特定のクラスだけにRTTIつけられたらいいんですが。
コンパイラはVC2003のなんですけど。
そもそもC++の仕様じゃないんでしょうか?

545 名前:デフォルトの名無しさん :03/09/28 02:55
>>544
RTTIありで何の問題があるの?

546 名前:516 :03/09/28 03:10
いいものは金を出す
悪い物は金出さない
代金と商品の質が釣りあってないのが悪いんだよ
特に>>508のようにSEの言われるがまま糞プログラム作ってる香具師の
ソフトには金払いたくない
どうせ、DQN会社向けの幼稚なプログラムしかしないんだろ?

ところで、MSDNまだぁ?

547 名前:デフォルトの名無しさん :03/09/28 03:23
>>546
お前自分で言ってて矛盾に気づかないのか?
「いいものは金を出す、悪いものは金を出さない」
そしたら、VC++とかMSDNってお前にとっては悪い
ものなのか?
いっぺん警察に捕まって臭い飯食って頭冷やしてこい。

548 名前:デフォルトの名無しさん :03/09/28 03:35
つーかMSDN Libraryって最新のが既にネットに流れてるし。

549 名前:デフォルトの名無しさん :03/09/28 03:41
>>546
自分の仕事道具の一つも買えない超貧乏人の犯罪者のお前よりましさ。

550 名前:デフォルトの名無しさん :03/09/28 03:45
>>549
その辺にしといてやれ。>>546は無職なんだからあまり追いつ
めると逆切れして新聞に載る事件でもやらかしかねん。

551 名前:516 :03/09/28 03:47
何必死になってんだかww
おまいに迷惑かけた覚えはないがな

>>548
情報サンクス、それだけでプログラミングできるのか?
おれはVBすらしたことないんだが
ny用の自作ツール作りたいんだよ

552 名前:デフォルトの名無しさん :03/09/28 03:52
>>551
> それだけでプログラミングできるのか?
道具が揃っても、使う人間の能力が不足してると、どうにもならんぞ。

553 名前:516 :03/09/28 03:54
プログラムなんて誰でもできんだろ?
猿じゃあるまいし、道具さえそろえたらなんとかなるよ
で、MSDNあればできるのか?
一応「C++わか〜る」はもうすでに落としているのだが


554 名前:デフォルトの名無しさん :03/09/28 04:32
>>545
基本的に実行時の型情報は要らない設計だから。
デバック用の例外クラスと一部のバリアントに仮想関数を持たせてるだけです。
全部に標準の型情報つけた方がいいと思いますか?

555 名前:デフォルトの名無しさん :03/09/28 04:35
答えになってなかった。
何故RTTIに問題あるのか・・・。
オーバーヘッド。
だから個別につけることはできないのか聞いたんですけど。

556 名前:デフォルトの名無しさん :03/09/28 04:46
今日、tchar.h をみていたら、

#ifdef _cplusplus
extern "C" {

というのがありましたが、これは具体的にどういったものなんでしょうか?

557 名前:デフォルトの名無しさん :03/09/28 04:54
manglingされない/しないことの宣言、かな。

558 名前:デフォルトの名無しさん :03/09/28 08:09
>>556
>>306 から読み直せ。

559 名前:デフォルトの名無しさん :03/09/28 08:11
>>553
> で、MSDNあればできるのか?

この板見ててわからないんだったら、たぶん一生無理だな。(ケケッ

560 名前:デフォルトの名無しさん :03/09/28 08:46
いい加減相手してるヤツがうざいな

561 名前:デフォルトの名無しさん :03/09/28 09:00
>>555
オーバーヘッドたって、各クラス毎に仮想関数テーブルのエントリ1個と
type_infoオブジェクト1個分のメモリ消費が増えるだけなので、そんなに
問題になる?

仮想関数毎切って良いなら、コンパイラ拡張で
 http://www.microsoft.com/japan/developer/library/vccore/_langref_novtable.htm
クラス毎にON/OFFする機能はそれなりにあると思う。

562 名前:デフォルトの名無しさん :03/09/28 09:44
>>561
うそぉ。これ見て初めて知ったんだけど、vtableってデフォルトで絶対作られるもんだったの?
仮想関数なしならテーブルもなしだとばっかり・・・。アホですた。
オーバーヘッドのことだけど、CPUのソフトエミュレーションしてて、サイズというより速度の問題かな。
コンストラクトの度にポインタ作るバイトコード実行してたら遅そうだから。
あと、文字列切り刻みまくりのリンクリストマニアだったりするので。
とりあえずありがとう。

563 名前:デフォルトの名無しさん :03/09/28 09:51
>>562
> vtableってデフォルトで絶対作られるもんだったの?

どこにそんなこと書いてありますか?

564 名前:562 :03/09/28 09:52
ん?純粋インターフェイスクラス?
またもの凄い勘違いをしてしまったかも。

565 名前:562 :03/09/28 09:53
>>564
ごめん間違えた。なかったことにして。

566 名前:デフォルトの名無しさん :03/09/28 09:54
ATLを使ったCOMオブジェクトクラスのように、
直接インスタンスを生成せず継承されることを前提としているクラスの、
vtableを作らないことでサイズをほんのちょっぴり節約するためのほとんど無意味なオプションだよ

567 名前:562 :03/09/28 09:57
>>564じゃない>>563
で、結局、RTTIを個別につけるのは無理ということでしょうか。
だって、インターフェイスクラス限定なら、インターフェイスを定義するだけで
何もしないコードを組まない限り、RTTIはついてしまうよね?間違ってますか?

568 名前:562 :03/09/28 09:59
>>566
ランタイムで人がいるのが嬉しいぃ。
銭ゲバメモリゲバの漏れなので、次から指定しますw

569 名前:デフォルトの名無しさん :03/09/28 10:03
つーか4バイト単位とかで節約したいならC++使わないでCとかアセンブラ使っとけ。

570 名前:デフォルトの名無しさん :03/09/28 10:12
時間的な話かとおもってた

>>568
> ランタイム
違和感

571 名前:デフォルトの名無しさん :03/09/28 10:14
時間はRTTI ONだろうとOFFだろうとdynamic_castやtypeid使わなきゃ変わらないだろ。

572 名前:デフォルトの名無しさん :03/09/28 10:14
RTTIとかけてみますた

573 名前:デフォルトの名無しさん :03/09/28 10:16
>>571
何の時間?
そもそもdynamic_castもtypeidも使ってないよ。

574 名前:デフォルトの名無しさん :03/09/28 10:42
>571
てゆーかOFFだと使えなくないか?

575 名前:556 :03/09/28 12:41
>>558
みましたが、

#ifdef __cplusplus

っていうのは、もちろん、コンパイラがC++であれば、っていう意味なのは明かなので、
ここの部分だけ解説されていてもしかたないです。

extern "C" {
}

これの部分が理解できないので。こっちのほうの意味をおしえてください。
どういう場合に、なぜ、こう書かなきゃならないのか。

576 名前:デフォルトの名無しさん :03/09/28 12:56
>>575
>>557は無視か?

577 名前:デフォルトの名無しさん :03/09/28 12:57
>>575
google あたりで extern "C" で検索すると、すぐに出てくると思うんだが……。
一言でまとめると C++ 以外の言語から C++ の関数を呼び出したい場合に
つける。

C++ だと関数オーバーロード (同じ名前の関数で引数型だけ違う) を実現するために、
シンボル名に型情報が含められる。たとえば俺の手元のコンパイラで void func(void)
をコンパイルすると オブジェクトファイルでは __Z4funcv というシンボル名になり、
void func(int) をコンパイルすると __Z4funci となる。

これを name mangling というんだが、name mangling の方法はコンパイラによって
バラバラで標準がない。そこで C や VB などから C++ 関数を呼び出す場合には
extern "C" を使って「この関数は name mangling するな」と指定する。副作用と
して関数オーバーロードができなくなる。

578 名前:デフォルトの名無しさん :03/09/28 13:04
>>576
無視っていうより、manglingを知らないから情報だと思わなかったと思われ
(知ってたらこんな質問自体しないはずだし(笑))

579 名前:デフォルトの名無しさん :03/09/28 13:21
>>575
> これの部分が理解できないので。こっちのほうの意味をおしえてください。

だったらなぜはじめからそう書かないんだ ?

教えたのに、「そっちは明らかだ。」とか言われるとすごくむかつくんだが。

580 名前:デフォルトの名無しさん :03/09/28 13:23
>>575
上で行われている与太話は実装の事だから無視していい

単にextern "C"はCリンケージの指定。

581 名前:デフォルトの名無しさん :03/09/28 13:29
>>577
>副作用として関数オーバーロード出来なくなる
って、当たり前じゃん。

582 名前:577 :03/09/28 13:56
>>580-581
何か癪に障ったのか?

583 名前:581 :03/09/28 14:04
別に!
ただ当たり前の事言ったまで。

584 名前:デフォルトの名無しさん :03/09/28 14:05
>>579
激しく同意

585 名前:デフォルトの名無しさん :03/09/28 15:18
556は初心者道の茶帯
もっと傲慢に振る舞わないと黒帯は難しい

586 名前:デフォルトの名無しさん :03/09/28 15:58
伝説の水野女史には遠く及ばないな。

587 名前:デフォルトの名無しさん :03/09/28 16:21
この方もすごいよ。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200211/02110017.txt

588 名前:デフォルトの名無しさん :03/09/28 18:00
>>587
状況的にはかなりかわいそう(SDKもまともに理解してないのにエクセルをオートメーションで操作しなければならない)
なんだが、そうとは思わせない傍若無人さがステキ。


589 名前:556 :03/09/28 20:44
いろいろありがとうございました。
要するに、

extern "C" { }

の {} で囲まれた中は、コンパイラがC++でも、
Cの機能のみをもってしてコンパイルするように、という意味だったんですね。
ありがとうございます。

590 名前:デフォルトの名無しさん :03/09/28 20:46
>>589
違います。

591 名前:デフォルトの名無しさん :03/09/28 20:48
>>589
えーと、Cの機能のみっていうとかなり拡大解釈っぽいが。
変化するのはリンク時のシンボルの名前であって、中身はC++フルに書ける

592 名前:デフォルトの名無しさん :03/09/28 20:58
>>589
「名前マングリング」で検索汁。

593 名前:デフォルトの名無しさん :03/09/28 21:03
例えば
extern "C" { }
の内部だと関数の多重定義がうまくコンパイルできない事がある。

594 名前:デフォルトの名無しさん :03/09/28 21:05
>>591
だよな。
extern "FORTRAN" とか書くこともできる処理系もあるし。

595 名前:デフォルトの名無しさん :03/09/28 22:10
どの処理系でも書くことはできる

596 名前:516 :03/09/28 22:35
彼女にちんこが臭いって言われたんですけどどうすればいいですか?
自分ではちゃんと洗ってる筈なんですけど
年中皮被ってる状態なのがいけないのかな?

597 名前:デフォルトの名無しさん :03/09/28 22:38
>>596
氏ね!

598 名前:デフォルトの名無しさん :03/09/28 23:03
オマエって満国際的な女だよなっていい返す

599 名前:516 :03/09/28 23:10
>>598
そんなことを言ったら嫌われちゃいます。
彼女は60億人いる中で私を愛してくれた数少ない逸材なんです。
嫌われたくありません。でも珍国際のは嫌です

600 名前:デフォルトの名無しさん :03/09/28 23:19
じゃあ、もう死ぬしかないね。

601 名前:516 :03/09/28 23:24
ちんこ切り落とすことに決めました。
彼女も僕のちんこ目当てに付き合ってるわけないですし(それほどの物でもないし)
僕のフィンガーテクニックでなんとかフォローします。
明日病院行って来ます
いろいろ、相談に乗って頂いてありがとうございました。

602 名前:デフォルトの名無しさん :03/09/28 23:25
>>596
通報しますた。

603 名前:516 :03/09/28 23:31
>>602
すみません。糞食って死にます
http://upload.fam.cx/cgi-bin/img-box/v4230928164933.jpg


604 名前:デフォルトの名無しさん :03/09/28 23:33
マイクラなんぞ喰らわんぞ。

605 名前:デフォルトの名無しさん :03/09/28 23:46
マイクラ・・・マインドクラッシャーの略。日本語で言うと精神破壊。
実際の>>603は炉画像なのである意味マイクラといえないことも無いだろう。

606 名前:516 :03/09/28 23:51
>>603
つーか、この画像かなり笑えるんだがw
矢口のぶッというんこをこんな風に頬張りたい

607 名前:デフォルトの名無しさん :03/09/29 00:54
class OK;
void OK();
template<typename T> class NG;
void NG();

g++(3.3.1 cygming)だと、
OKは両方いけるんだけど、NGは"redeclared as different kind of symbol"になります。
こういう言語仕様なんでしょうか?

608 名前:デフォルトの名無しさん :03/09/29 01:15
>>607
その環境手元にないけど、
エラーメッセージの通りだろ。
NGはすでに宣言されてるだけ。

609 名前:デフォルトの名無しさん :03/09/29 01:30
>>608
OKも宣言されているわけだが。

610 名前:デフォルトの名無しさん :03/09/29 01:58
>>607
14.2
A template-declaration can appear only as a namespace scope or class scope declaration.
In a function template declaration, the declarator-id shall be a template-name
(i.e., not a template-id).

つまりテンプレートに使われるシンボル名は同じ名前空間もしくはクラス空間内では
唯一でなければならない。従ってエラー。

611 名前:デフォルトの名無しさん :03/09/29 02:02
>>607
スマソこっちみたい。
14.5
A class template shall not have the same name as any other template, class,
function, object, enumeration, enumerator, namespace, or type in the same scope
(basic.scope), except as specified in (temp.class.spec).
Except that a function template can be overloaded either by (non-template)
functions with the same name or by other function templates with the same name
(temp.over), a template name declared in namespace scope or in class scope shall be
unique in that scope.

612 名前:デフォルトの名無しさん :03/09/29 02:12
>>608
OKは、規格の3.3.7 Name Hidingによってクラスの方の名前が隠される。
しかし、14-5でテンプレートクラス名は、ほかの関数やオブジェクトなどの名前とは
一緒に出来ない。よってNGはNG。

613 名前:デフォルトの名無しさん :03/09/29 02:16
先に出てた・・・(鬱

614 名前:デフォルトの名無しさん :03/09/29 02:34
>>608-612
ありがとうございます。

ところでC++の規格にはRationaleは無いのでしょうか?
今回の件も、根拠がわからんないです。

615 名前:デフォルトの名無しさん :03/09/29 14:53
クラスのメンバ関数の定義で引数リストに何も指定しないというのは
暗黙のうちにintを1つ取る関数として定義されるのでしょうか?
それとも定義未定とされるのでしょうか?
もしくはvoidとみなされるのでしょうか?
class Foo {
public:
 void Func();
};


616 名前:デフォルトの名無しさん :03/09/29 14:55
>>615
void。
ちょっと基本すぎるので、入門書ぐらい買って詠んだほうがよいかと。

617 名前:615 :03/09/29 14:57
class Foo {
public:
 virtual void Func() = 0;
};
class Ber1 {
public:
 virtual void Func(void) {} // OK
};
class Ber2 {
public:
 virtual void Func(int i) {} //コンパイルエラー
};
と言う事でvoidな事がわかりました。板よごしてすまそ。

618 名前:615 :03/09/29 14:59
>>615
Fooから派生するの忘れた。
逝ってきます。

619 名前:デフォルトの名無しさん :03/09/29 15:59
どうでもいいことだが、foo ときたら普通 bar だぞ

620 名前:デフォルトの名無しさん :03/09/29 19:35
じゃあhogeときたら?

621 名前:デフォルトの名無しさん :03/09/29 19:40
hage

622 名前:デフォルトの名無しさん :03/09/30 01:54
_ト ̄|○・・・あぁ、どうしても出来ない!

623 名前:デフォルトの名無しさん :03/09/30 09:42
>>614
> ところでC++の規格にはRationaleは無いのでしょうか?
そういえば無いなぁ。なんでだろう。

624 名前:デフォルトの名無しさん :03/09/30 16:39
>>620
piyo

625 名前:デフォルトの名無しさん :03/09/30 16:54
fuga

626 名前:デフォルトの名無しさん :03/09/30 17:19
hogera

627 名前:デフォルトの名無しさん :03/09/30 21:08
hidebu

628 名前:デフォルトの名無しさん :03/09/30 21:37
fstreamを用いてファイルの先頭に文字を挿入する方法はありますか?
後ろに挿入する場合は
ofstream fout(FilePath,ios::out|ios::app|ios::ate);
でできるんですけど、前はどうもうまくいきません・・・

何か良い知恵がありましたらよろしくお願いします。

629 名前:デフォルトの名無しさん :03/09/30 21:38
無理

630 名前:デフォルトの名無しさん :03/09/30 21:41
ママー、vector<bool>だとバッファへのポインター採れないね。

631 名前:デフォルトの名無しさん :03/09/30 21:51
>>629
ええええええええええええぇぇぇぇぇぇ

632 名前:デフォルトの名無しさん :03/09/30 21:54
C++の実践的な技術を身につけたいんですが
どんな本を買えばいいですか?お勧めとかあったら教えてください。

幼稚な質問ですいません。

633 名前:デフォルトの名無しさん :03/09/30 22:02
>>5

634 名前:デフォルトの名無しさん :03/09/30 22:08
>630
boolのvectorは作ったらだめだったんじゃなかったっけ?

635 名前:デフォルトの名無しさん :03/09/30 22:08
>>628
先に文字を追加したファイルを作り、そこへアペンドモードで元のファイル
を追加して元のファイルを削除してリネーム。

636 名前:デフォルトの名無しさん :03/09/30 22:19
>>634
ダメってことはないが……

ただ specialization されてるので bool 以外の vector<T> で使えるメソッドでも
vector<bool> で使えないメソッドがいくつかあったりして、現実には非常に使い
づらい。bitset 使った方が良いよ。

637 名前:デフォルトの名無しさん :03/09/30 22:25
>>635
やっぱりその方法しかないですか・・・
分かりました。ありがとうございました。

実はその方法でもう実装は済んでるんですけど、
もっとエレガントな方法はないかなぁ、と思っていたんで。

638 名前:デフォルトの名無しさん :03/09/30 22:58
>>636
むしろ Boost::dynamic_bitset 使った方がいいかも。

639 名前:デフォルトの名無しさん :03/10/01 00:16
>>628ではないんだが、
本当にファイルの前に追加する方法ってないのか?

640 名前:デフォルトの名無しさん :03/10/01 00:20
>>639
もはやファイルシステム固有の問題かと

641 名前:デフォルトの名無しさん :03/10/01 00:24
>>640
そうか。とすると、テキストエディタとか作るのは
実は結構たいへんだね。

642 名前:デフォルトの名無しさん :03/10/01 00:32
>>641
うん、大変だよ。
作ったことないみたいだねw

643 名前:デフォルトの名無しさん :03/10/01 00:33
>>642
普通はつくらんでしょう、そんなもの(w

644 名前:デフォルトの名無しさん :03/10/01 00:35
>>643
エディタやコンパイラって学生のときに結構作るような。結構勉強になる

645 名前:デフォルトの名無しさん :03/10/01 01:08
今までのファイルの内容を新しく追加するサイズ分移動して、
その後に先頭から追加分を書く。

エレガントには程遠いが、ファイルは1つで済む。

646 名前:デフォルトの名無しさん :03/10/01 08:08
>>645
言うほど簡単じゃない罠。
ファイルの内容を移動するって、具体的にどこからどこへ移動するか分かって書いてる?

>>641
テキストエディタなら、行ごとにリスト作るのが一般的。
行単位の編集しかしないエディタが多いのはそれが理由。
メモリ上でファイル全体のイメージを作っておいて、書き出すときは一気に先頭から書く、と。
メモリ上で取り込みきれないようなファイルを取り扱うエディタを書くのは、
その辺りも全て考慮しないといけないからどうしても一時ファイルが必要で、
だからMS-DOSの時代のエディタはどれもそういう作りになっていた。

647 名前:デフォルトの名無しさん :03/10/01 10:01
ファイル内での中身の移動なんて、たいして難しくもないと思うけど…

スピードは遅いし、確かにエレガントでは無いけど。

648 名前:デフォルトの名無しさん :03/10/01 10:04
ファイルシステムレベルでいじれるなら、リンクリストの要領で先頭に挿入できる
気もするが。

649 名前:デフォルトの名無しさん :03/10/01 14:28
C++的にはconst,enum,inlineでできるところは
マクロを使わずに済ますべきですか?
それともマクロを使うことで得られるメリットの
ようなものがあるんでしょうか?

コンパイラはg++を想定しています。Cのソースとして
コンパイルするなどというセコイことは考えてません。

650 名前:デフォルトの名無しさん :03/10/01 14:30
マクロでできることはマクロでやる。

651 名前:デフォルトの名無しさん :03/10/01 14:34
・とあるクラスに、staticメンバが一つある
・そのクラスのインスタンスが一つでも存在しているならば、
 そのstaticメンバは初期化されていなければならない。
・そのstaticメンバを初期化するには、初期化関数を呼ばなければならない。

…のですが、これを綺麗に実装する方法はあるのでしょうか。
今はコンストラクタが呼ばれるたびに、初期化チェックをしていますが冗長な気がして…。

652 名前:デフォルトの名無しさん :03/10/01 14:47
>>650
inline関数がある処理系のみを考えているのに、
函数マクロでそれを記述することにどんな意味があるんでしょう?
ってこれはCスレで聞くべきないようか。

653 名前:デフォルトの名無しさん :03/10/01 14:53
>>651

コンストラクタでのチェックによるオーバーヘッドが無視できない程クリティカルな処理、
あるいは頻度の高い処理なら、ファクトリ関数をポインタで持っておいて1回目以降は
それを付け替えちゃえばいいんじゃない?

あとはクラスにそこまでのインテリジェンスを持たせずに、Open/Close 系のメソッドを
用意して使う側で適切に呼び出してもらうってのも悪くないと思う。Open されずにインス
タンスが生成されたときに適切なエラーを出せるなら。

654 名前:デフォルトの名無しさん :03/10/01 15:16
>>653
1段目はええと…2回目からは空操作させるということですよね。
2段目はCoInitializeみたいなものでしょうか。

早速作り替えてみます、レスありがとうございました。

655 名前:デフォルトの名無しさん :03/10/01 20:42
>>653
bool変数のチェックのコストが気になるような状況で
ポインタを介した関数呼び出しを薦めるのはいかがなものか。

656 名前:デフォルトの名無しさん :03/10/01 21:36
>>655
そういやそうだ。。寝ぼけてました。


657 名前:デフォルトの名無しさん :03/10/01 21:41
float foo(){
union{ float f; int i; };
i=10;
return f;
}

struct A{
float foo(){
union{ float f; int i; };
i=10;
return f;
}
};

上のfoo関数はコンパイルが通るのですが、下のfooメンバ関数のコンパイルが通りません。
そんな仕様があるのですか?

私の環境はVC7で、エラーメッセージは以下のとおりです。

error C2065: 'i' : 定義されていない識別子です。
error C2065: 'f' : 定義されていない識別子です。

658 名前:デフォルトの名無しさん :03/10/01 21:44
>>657
VC7.1ではコンパイルできたっぽい

659 名前:デフォルトの名無しさん :03/10/01 21:53
>>658
サンクス。


コンパイラのバグっぽいのかな・・・
とりあえず以下のでいけたのでこれでいくことにします。

struct A{
float foo(){
union{ float f; int i; } e;
e.i=10;
return e.f;
}
};

660 名前:デフォルトの名無しさん :03/10/01 21:55
レスリング部に所属している集団が部活帰りに
「ボクシングってダセェよな、シッシッ言っちゃってよ。」などと
言っているのが聞こえたので走って近づき、リーダー格の奴に、
右ボディを食らわせて前屈みにし、ワンツー連打から左フックでKOした。
オレはその場を立ち去る時に残りの高校生たちを指差し、
「お前らも灰になれるものを見つけろよ」と言った。
離れていく時に後ろから、「ボクシングっていいよな。」と声が聞こえた。


661 名前:デフォルトの名無しさん :03/10/01 22:01
>>659
クラスの外に定義を持ってくればOK


662 名前:デフォルトの名無しさん :03/10/01 22:20
おい、お前。そう、お前だよ。
「このスレおもろいから見てみ」「2ちゃんの歴史に残る名スレだぜ」とか言われてホイホイと
このhtml化されたスレを見にきた、お前のことだ。
どうだ?このスレおもしれーだろ。
でもな、お前はこのスレを読むだけで、参加することはできねーんだよ。
可愛そうにな、プププ。
俺は今、ライブでこのスレに参加してる。
すっげー貴重な経験したよ。この先いつまでも自慢できる。
まあ、お前みたいな出遅れ君は、html化されたこのスレを指くわえて眺めてろってこった。

663 名前:あえてマジに受け取る :03/10/01 22:23
>>660
不変表明になぜか違反するって事?
関数に入った時と出て行く時で,オブジェクトが変化してしまう,と。
オブジェクトを乱暴にいじるからだ。
適切に const は使ってる? mutable でどっか罠に引っかかってない?
explicit を適切に使わなかったから,つーのも意外に多い。
なるべく最新版のコンパイラを使って,ウォーニングを念入りにチェックするべきだ。

664 名前:デフォルトの名無しさん :03/10/01 22:27
>>661
そうすると、グローバル変数になっちゃうんですけど・・・?

665 名前:デフォルトの名無しさん :03/10/01 22:57
こ〜ゆ〜事
struct A
{
    float foo();
};
float A::foo()
{
    union{ float f; int i; };
    i=10;
    return f;
}

666 名前:デフォルトの名無しさん :03/10/01 23:47
>>665
なるほど。どうもサンクスです。

667 名前:デフォルトの名無しさん :03/10/01 23:57
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪
なんてありきたりなんでしょうね♪
誰もが皆、一瞬つけてみたくなる発想のレスです♪
しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、
こういうレスは控えます♪
しかし、この人はしてしまったのです(^^;ワラ
「誰もが思い付くような事」を堂々と♪
この人にとってこのレスは何なのでしょうか♪
このレスをしている間にも時間は刻々と 過ぎ去っているのです♪
正にこの人のした事は「無意味」「無駄」でしかありません♪
ああ・・・何ていう事でしょう(^^;ワラ
図星で泣いちゃうかも(^^;ワラ

668 名前:デフォルトの名無しさん :03/10/02 01:16
つぼにはまったw
誤爆なのか狙ったのかはわからんが。
もし狙ったのなら面白すぎ。

669 名前:デフォルトの名無しさん :03/10/02 14:34
これだけは確実だ。
667==668

670 名前:デフォルトの名無しさん :03/10/02 15:46
669ってあたまわる〜いwww

671 名前:デフォルトの名無しさん :03/10/02 16:15
どんぴしゃだった模様。
必死の煽りが泣かせます。

↓負け犬の遠吠え

672 名前:デフォルトの名無しさん :03/10/02 16:17
おまえらバカじゃないのか?ほんと自分は出来る風ですか?
ほんとにバカ、オメーラ、みんな、ネット荒らしとどこが違うんだ!?
ほんとな、おまえらはみんな、ここに来る資格ねーな!!
デフォルトの名無しさんだっけ!!おまえしね!!人が謝ってのに何が
あやしいっておまえみたいのがいるから日本がだめになるんだ!!
分かったバーカ!!もう荒らしでも何でもいいよ!!
オメーラみたいなバカどもにつき合ってもしかたないから!!
あんたらみたいのはもうこのよにもいらない !!

673 名前:デフォルトの名無しさん :03/10/02 16:43
>>651
1) プログラムの最初で初期化
2) 最初のインスタンス化のときコンスタラクタが呼ばれる前に初期化
3) コンストラクタ内で初期化

綺麗にやるにはこれくらいしかなさそう。
しかも初期化をダイナミックに制御できるのは3だけだから、
結局今やってるやり方しかないかも。
ループ内で大量にインスタンスを作るような場合、
3だとオーバーヘッドが大きいなら、
2の方法でループの直前で初期化。
色んなとこでバラバラに生成する場合、
2だとコーディングがめんどくさすぎるので、1か3だと思う。
ケースバイケースということだね。

674 名前:デフォルトの名無しさん :03/10/02 17:33
class Hash
{
public:
string key;
int val;
int default_val;
Hash(int def){default_val = def;}
/*int& operator()(const string &arg){
cout << "Called as LHS" << endl;
key = arg;
return val;
}*/
int operator()(const string &arg) const{
cout << "Called as RHS" << endl;
if(key == arg){
return val;
}
else{
return default_val;
}
}
};

int main(){
Hash h(-1);
//h("a") = 1;
cout << h("b") << endl;
return 0;
}

675 名前:674 :03/10/02 17:33
上記のソースで質問です。
まず、上記のソースはコンパイルすると当然
h("b")はint operator()(const string& arg) constの呼び出しになります。
ところが、コメントを外してコンパイルすると
h("a"),h("b")の双方がint& operator()(const string& arg)の呼び出しになってしまいます。
つまり、左辺値としての呼び出しと右辺値としての呼び出しを区別して
関数をオーバーロードしたいんですが、どうすれば実現できますか?
あと、疑問としてこの2つのoperator()は重複宣言になりそうに思いますが、
コメントを外してもコンパイラが通るのはなぜですか?
試した環境はVC++6.0とg++(2.xx)です。

676 名前:デフォルトの名無しさん :03/10/02 18:34
>>675

const は「変更されない」ではなくて「変更できない」だから、
h は変更可能だから、たとえ変更されなくても常に LHS になる。

cout << const_cast< Hash const& >( h )("b") << endl;

で何とかなるかも。

677 名前:デフォルトの名無しさん :03/10/02 19:50
>>675
HashNodeClass &Hash::operator()(....);
とやって
HashNodeClass::operator=(....);
HashNodeClass::operator<<(....);
を実装したら?

678 名前:デフォルトの名無しさん :03/10/02 21:03
コンテナで異なるオブジェクトを一括して管理したいのですが、

(オブジェクトA、オブジェクトB、オブジェクトC、オブジェクトA・・・・)

という具合に・・・

いい方法ありますか?

679 名前:デフォルトの名無しさん :03/10/02 21:10
boost::any

680 名前:あい :03/10/02 21:16
かなりおすすめの無料着メロサイト♪
ゲームとか画像UP掲示板とかもあって面白そうだったよ〜♪
ほんとだまされたと思って行って下さい☆
絶対満足するから〜♪

http://yokozuna.tv/m.php?i=21

681 名前:デフォルトの名無しさん :03/10/02 21:37
質問です
ClassA、ClassBという2つのクラスがあると仮定します。
ClassA(子クラス)はClassB(親クラス)を継承しています。

この場合に以下のプログラムは正常にdelete(開放)されるのでしょうか?
ClassA *pClassA;
ClassB *pClassB;
pClassA = new ClassA();
pClassB = pClassA;
delete pClassB;

どうかよろしくおねがいします

682 名前:デフォルトの名無しさん :03/10/02 21:42
>>681
ClassBのデストラクタがvirtualなら。

683 名前:デフォルトの名無しさん :03/10/02 21:53
>682
ありがとございました、これで安心して製作を続けることができます。


684 名前:681 :03/10/02 22:09
すいません、もう1つ質問させてください

ClassA、ClassB、ClassCという3つのクラスがあると仮定します。
ClassB(子クラス)はClassC(親クラス)を継承しています。
ClassA(子クラス)はClassB(親クラス)を継承しています。

この場合に以下のプログラムは正常にdelete(開放)されるのでしょうか?
ClassA *pClassA;
ClassC *pClassC;
pClassA = new ClassA();
pClassC = pClassA;
delete pClassC;

先ほどと同じ考えでClassBとClassCのデストラクタがVirtualならOKなのでしょうか?
また継承されるクラスが増えても継承されるクラスすべてのデストラクタに
Virtualをつければよいのでしょうか?

685 名前:デフォルトの名無しさん :03/10/02 22:42
>>684
ClassCのデストラクタがvirtualなら、そこから継承したクラスの
デストラクタからはvirtualキーワードが省略できる。(省略できる
だけでvirtualは付いているものとコンパイラは判断する。)

686 名前:デフォルトの名無しさん :03/10/02 23:00
>>685
ということは継承される大元(上記の場合はClassC)のデストラクタに
Virtualがついていれば何個継承してもよいということですね。
悩みが解決しました、ありがとうございました。

687 名前:デフォルトの名無しさん :03/10/03 00:44
>>676
constの付加にconst_castはつかわないでほしいです。

688 名前:デフォルトの名無しさん :03/10/03 01:27
ところで皆さん、一時バッファってどうしてます?

689 名前:デフォルトの名無しさん :03/10/03 01:39
いきなりなんの話だ?

690 名前:674 :03/10/03 02:16
>>676,677
なるほど。
いずれにせよ、簡単に右辺値か左辺値か見分けるのは難しそうですね。
ありがとう。

691 名前:デフォルトの名無しさん :03/10/03 08:02
>>674
「More Effective C++」にそういうことを行うプロキシークラスがのってまつ。

692 名前:デフォルトの名無しさん :03/10/03 10:10
とあるオブジェクトAと、それを操作したい
互いに独立したクラス(コールバックで独自に動くような)があります。
独立したクラスとは、メインのWindowクラスと、Dialogクラス×2の、3つです。

こういう場合どんな風に関連づけたら良いのでしょうか?

自分なりに考えたのでは
1、とりあえすWindowクラスにAをメンバとして持たせ、
  GetA()系を用意して安易にそれを公開し、他のDialogクラスを賄う

2、メインウィンドウにAをメンバとして持たせ
  Window->func(){ A->func(); }みたいな物をいちいち用意する。

693 名前:デフォルトの名無しさん :03/10/03 12:43
微妙にスレ違いな気もするけどお願いします。
スレッドセーフなDLL(非MFC)の作成は、
・staticは使わない
・グローバルはTLSを使用する
・マルチスレッドDLLとぢてリンクする
だけでOK?

694 名前:デフォルトの名無しさん :03/10/03 13:53
>>693
めちゃくちゃスレ違いです

695 名前:693 :03/10/03 14:00
>>694
該当スレ見つけた。失礼、取り下げ。
ここだね。
マルチスレッドプログラミング相談室 その2
http://pc2.2ch.net/test/read.cgi/tech/1037636153/

過去ログ読めばわかるかな・・・

696 名前:デフォルトの名無しさん :03/10/03 22:04
>>692
ウィンドウクラスに A を持たせるのが、そもそも良くないような気がするけど。使い捨ての
小さなアプリならともかく、まじめに書くなら

 データを管理するクラス
 それを表示するクラス (ウィンドウ・ダイアログ)
 データを操作するクラス

と 3 つに分けて管理する方が良いよ。いわゆる MVC パターンてヤツ。

その上で、データの変更をウィンドウ・ダイアログに通知するために Observer パターンを
組み合わせて使うのが一般的だと思われ。

697 名前:692 :03/10/04 11:14
>>696
こんなレスをお待ちしてました!
なーるほど、こんな良い方法が…、御陰様でObserverパターンにより
ViewとModel間は、素晴らしくスッキリした、依存の少ない形に出来そうです。

Cotroller(Windowsだと≒View?)とModelの間が、まだよくイメージ出来てないのですが、
要するにWM_LBUTTONDOWとかをイベントとして、Observerどもに通知するのかな…。

キーワード頂けたのでもう少し勉強してみます。
詳細なレスありがとうございました。


698 名前:デフォルトの名無しさん :03/10/04 17:39
すいません。C++初心者ですが教えていただけないでしょうか?
(ID、値)というデータが次々に入力されてくるとしますが、IDごとにそれぞれ
入力された順番を考慮して保持したいと考えます。ID番号ごとにqueueを作って、
既存のIDが入力されたらqueueにpushし、新規のIDが来たらそのIDに対応するqueueを
新たに作ってpushするという方法を考えました。
しかしどうやって書いたらいいかわかりません。後でID番号を基にそれぞれの
queueの中身を参照できるようにするには、どのように書いたらいいのでしょう?
どなたか、教えていただけませんか?

699 名前:デフォルトの名無しさん :03/10/04 17:44
>>698
std::map<ID_type, std::queue<value_type> >

を使うか、場合によってはもっと簡潔に、

std::multimap<ID_type, value_type>

を使えばよい。

700 名前:デフォルトの名無しさん :03/10/04 17:45
map<int, queue<int> >

701 名前:698 :03/10/04 19:00
>> 699,700

なるほど、mapを使ってキーと値(キュー)を保持するようにすればよいのですね。
すばやいお返事どうもありがとうございます。

ついでに、ふと疑問に思ったのですけど、mapとmultimapを使う場合に
値を検索する速度に違いはあるのでしょうか?
速度が問題となる場合には、どちらのほうがおすすめなのでしょうか?
もしよかったら、この質問にも答えて下さるとありがたいのですが。

702 名前:デフォルトの名無しさん :03/10/04 19:06
自分で試してベンチ取ればええやん

703 名前:デフォルトの名無しさん :03/10/04 20:51
つか、multimapで同一キーを持つ要素が挿入順に並ぶことを期待して大丈夫なのか?
mapを使うかmultimapを使うかは検索速度で決めるんじゃなくてデータ構造で決めるべし。

704 名前:デフォルトの名無しさん :03/10/04 22:47
関数オブジェクトって実行時にコンストラクタが走りますよね?
って事は、結果を保持したいとか、コンストラクタで初期化する
必要がある場合を除いて、グローバル関数使ったほうが速い/良い
のでしょうか?

struct func{
func(){std::cout << "Constructor!" << std::endl;}
void operator()(){std::cout << "operator()!" << std::endl;}
};

int main()
{
func()();
}


705 名前:デフォルトの名無しさん :03/10/04 22:59
>>704
何故必要ないコンストラクタをわざわざ書いてパフォーマンスが落ちるとかほざく?

706 名前:デフォルトの名無しさん :03/10/04 23:00
関数オブジェクト使ったほうが速い/良い


707 名前:デフォルトの名無しさん :03/10/04 23:02
>>706
関数オブジェクトの方が速くなるのって、
テンプレートが絡んでるときだけじゃない?


708 名前:デフォルトの名無しさん :03/10/04 23:15
>>707
関数オブジェクトのメンバーが全てインライン関数ならテンプレートと同じだと。
ついでにインライン関数でも同じになると思う。


709 名前:デフォルトの名無しさん :03/10/04 23:33
>>704
速いかどうかは人に聞く前に実測しる。
ストップウォッチ計測もアセンブラソースも投げ出したまま
いくらきれい事を並べても所詮は空想論、論じる価値がない。

それからtemplateとinlineは別物。
template化したからといってそれでinline化を要求したことにはならない。
Bjarneくらいしっかり読んでおくことも
実測値から考察をするにあたって必要なことだ。

710 名前:704 :03/10/04 23:47
レス有難うございます。初心者なので傾向が知りたかったのです。

>>705 実際に走ってる事を確認するために書いただけです。
>>709 確かにそうですが、皆さんはどのように使い分けているのか教えていただけますか?

711 名前:デフォルトの名無しさん :03/10/04 23:50
>>710
使い分けるも糞も必要なところで使って必要ないところで使わない、それだけだろ。
必要ないところで使うのはただの馬鹿だし、必要ないところで使わない選択肢はない。

712 名前:デフォルトの名無しさん :03/10/04 23:56
>>710
もっとC++関係の書籍を読んで勉強しな。
そうすれば>>711の言ってることがわかるようになる日がくるかも。
来なければ、向いてなかったってことだ。

713 名前:711 :03/10/04 23:58
いや、一生来ないだろ
×必要ないところで使わない選択肢はない。
○必要なところで使わない選択肢はない。

714 名前:704 :03/10/05 00:41
両方でコーディング可能な場合はどうしたらいいんですか?

715 名前:デフォルトの名無しさん :03/10/05 02:58
>>714
文盲?

> 必要ないところで使うのはただの馬鹿

両方で出来る=関数で出来る=わざわざファンクタにする必要なし

716 名前:デフォルトの名無しさん :03/10/05 03:05
テンプレートクラスの使い方が難しいね。
Modern〜の使い方みたいなスマートな奴を
スパスパ思いつくぐらいになりたい。

717 名前:デフォルトの名無しさん :03/10/05 08:37
より適当な方を選ぶ。

718 名前:デフォルトの名無しさん :03/10/05 11:37
ボーランドのコンパイラだとファンクタとかインライン展開してくれなかったりしますか?
なんかqsortの方がstd::sortより3倍速いんだけど。

一応下記のコードなんですが。
わざわざc_strとstrcmp使ってるのはoperator==よりこっちの方が速かったからなんですが…

//qsort
inline int personsortbynameproc(const void *a, const void *b)
{
 return strcmp(((Person *)a)->GetName(0).c_str(),
  ((Person *)b)->GetName(0).c_str());
}

//std::sort
struct PersonNameComapare
{
 inline operator ()(const Person &a, const Person& b) const
  { return strcmp(a.GetName(0).c_str(), b.GetName(0).c_str()) < 0; }
};

719 名前:704 :03/10/05 12:15
>>715 どうも。関数>ファンクタって事ですね。>>706さんと矛盾してますが。
さらに質問。
template<class T>
struct less : public binary_function<T, T, bool> {
bool operator()(const T& x, const T& y) const;
};
は何故ファンクタにしてるんですか?関数でいいじゃないですか。
単に、binary_functionを継承したかったからですか?

720 名前:デフォルトの名無しさん :03/10/05 12:17
そうです

721 名前:704 :03/10/05 12:21
>>720 ありがとうございます。すっきりしました。

722 名前:デフォルトの名無しさん :03/10/05 12:38
アフォしかいないのかここは…
とりあえずEffectiveSTLの6,7章を穴が空くまで読んどけ。

723 名前:704 :03/10/05 12:47
>>722 買ってきて読んでみます。でも相談室なんだから許してください。

724 名前:fool :03/10/06 09:08
そりゃ重要な局面で必要ないところで遊んだためにコケたらヴァカだろうけれど、
時間のある時にいろんな方法で遊んで手札を増やす事は、イカスとおもうズラ。

必要ないからってのは、解らん事から逃げる口実に使う言葉であって、
合理的に選択を絞る理由になってないんじゃない?(トカアオッテミルテスト

725 名前:デフォルトの名無しさん :03/10/06 10:09
テンプレート関数のexportの実装方法を解説してるドキュメントは
ないでしょうか?Cに慣れた頭には、これはどう実現してるのか
さっぱり分りません。

726 名前:デフォルトの名無しさん :03/10/06 17:02
>>719
1: 代わりに template<class T> bool less( const T& x, const T& y ); だとすると、
 オーバーロードの関係で std::sort( v.begin(), v.end(), &less<T> ); と書けない。
 std::sort( v.begin(), v.end(), static_cast<bool (*)(const int&,const int&>(&less<T>) );
 …みたいに長ったらしくなる。

2: std::set や std::map などでは、比較基準としてファンクタを取れるように
 設計しとく必要がある。(関数じゃなくてファンクタを使いたい場合も当然あるので。)
 なので、デフォルトの比較基準である less<T> も関数でなくてファンクタとして
 用意しとくのが自然。

3: template<template<class> class F = std::less> class { ... };
 みたいに書いて、less<int> やら less<string> やら…の
 具体的な関数を全て渡さなくても std::less というテンプレートを
 比較ポリシーとして一気に渡す、みたいな手が使えるようになる。

etc.

> 何故ファンクタにしてるんですか?関数でいいじゃないですか。
もちろん、関数を使えば済むところをファンクタを使うのは無意味だ。
例えば、i < j で済むのを less<int>()(i, j) とか書いてたら変。
んだけど、特に大小比較のような他の演算のパラメータとして渡すことの
多い演算は、上に幾つか上げたようにファンクタにしとくと使い所が広がって嬉しい。

727 名前:デフォルトの名無しさん :03/10/06 20:35
>>726
加えて、関数ポインタを使うとインライン展開できない処理系が大半だから。

728 名前:デフォルトの名無しさん :03/10/06 21:04
ファンクタだったらどの処理系もインライン展開できるのか?

729 名前:デフォルトの名無しさん :03/10/06 21:10
関数ポインタよりは可能性高そう

730 名前:デフォルトの名無しさん :03/10/06 21:23
横からお邪魔して質問しますが、
実際にインライン化されてるかどうか知るには
呼び出しを大量にかけてベンチ取るしか方法はないですか?

731 名前:デフォルトの名無しさん :03/10/06 21:27
>>730
アセのソースみたりしないの?

732 名前:730 :03/10/06 21:33
>>731
あー、すんません。そういう技量はないんですよ。

733 名前:デフォルトの名無しさん :03/10/06 21:34
>>730
私は大抵逆アセンブルコード見て…

って、よく考えたらmapファイルあたり吐かせたらそのあたり分からんかな?

734 名前:730 :03/10/06 21:48
うむ、何を言われているのかさっぱり分からん。
ただ一つ、もっと勉強せないかんということだけは分かりました。
修行してきます。。。お邪魔しました。

735 名前:デフォルトの名無しさん :03/10/06 22:25
今mapファイル見てきたが。
どうやらinlineで埋め込まれちまった関数はmapファイルに出力されないらしい。
まあ至極当然なのは確かだが、せめてinlineとかって表示してくれれば便利なんだが。

…inlineはコンパイラの仕事でmapはリンカの仕事か? とすると無理か…?
まあそのへんは詳しくないのでともかく。

というわけでmapファイル出力させて、
mapファイルを対象関数名で検索して出て来なかったら多分inline展開されてる。
でなきゃ、一回も呼び出してなかったせいで最適化の結果削除されたとかな。
が、もっともinline展開しても実体が作られる場合
(例えばその関数ポインタを使ってるとか)があるので、
mapファイルに出力されていてもinline展開されてるってことはあるかもしれず。

ちなみに確認したのはVC7.1。

736 名前:デフォルトの名無しさん :03/10/06 23:35
どう考えたってアセンブラ出力を見るのが一番確実だろ

737 名前:デフォルトの名無しさん :03/10/06 23:35
inline関数のアドレスを外部のモジュールに渡すときは
どうなるんでしょうか?inline関数が基本は型付きマクロで
ありながらポインタとしてやり取りできるとなると、どこまでが
インライン化され、またそうでないのかが明確になっていないと
だめですよね。

738 名前:デフォルトの名無しさん :03/10/06 23:35
>>732
その時点で終わってる
インライン=アセンブラレベル

アセンブラをじっくり読んでみる気のない者は二度とインラインを口にするな
ハード屋とじっくり話してみる気のない者は二度と実行速度を口にするな

やる気のない者は業界を去れ
空想論ばっかりで汚れねえおこちゃまは公害だ

739 名前:デフォルトの名無しさん :03/10/07 00:41
>>737
規格でどーなってるのかは知りませんが。
とある実装系では
「要所要所にinline展開しつつ、外部から呼ばれるための本体ももつ」
という実装がしてあったとかしてないとか。
聞いた話なんで鵜呑みにされても困りますけど…

もしこのようになってるとしたら、
関数ポインタ使ってるとmapファイルに載っちゃうんで、
mapからのinline判定はむりっぽそうですね。

とゆーのが735の
> inline展開しても実体が作られる場合
> (例えばその関数ポインタを使ってるとか)があるので、
の部分かな?

740 名前:デフォルトの名無しさん :03/10/07 01:17
インライン展開されていても、それとは別に実体があることもある。
だから、関数のアドレスを外部に渡しているからといってインライン展開されない証拠にはならない。
使われない関数は実体がないこともある。
だから、マップファイルにシンボルがないからといってインライン展開される保証にはならない。

741 名前:デフォルトの名無しさん :03/10/07 01:23
つーか全体としてのパフォーマンスに影響がなければinline展開されてようが
されていまいがしったこっちゃないと思うが。asm読めないならなおさら。

742 名前:デフォルトの名無しさん :03/10/07 01:46
逆に言えば、inline関数が関数としてインスタンス化されるのは
どこなんでしょうか?関数のアドレスを取得した時点ではまだ実体は
必要ないんですよね。インスタンス化のためのなんらかの条件があるはずですが。。。

743 名前:デフォルトの名無しさん :03/10/07 01:51
>>742
アドレス引いたらリンケージを確保するために実体化するんじゃないか?

744 名前:デフォルトの名無しさん :03/10/07 02:04
>>743
なるほど。そう言われてみればそうですね。

745 名前:デフォルトの名無しさん :03/10/07 02:05
inline指定されたからといって、inline展開されることが保証されるわけではない

この時点で、742のような議論はすべて処理系依存であり、無意味。
自分で出力を確かめろと何度も言われている。
もちろん、その処理系のそのバージョン限定でしか通用しない知識だが。

746 名前:デフォルトの名無しさん :03/10/07 10:02
コンテナのある一つの要素を、ずっと見張ったり操作する必要があるのですが、
iteratorをつかって、いつまでもその要素を参照しているというのは、ありなのでしょうか?
(もちろんコンテナの順番が変わったりするまでですが)

今まで見たソースには、iteratorをそういう用途に
使っている物が、ひとつも無かったので不安でして…。

いまはコンテナをポインタ型で持ち、参照もiteratorではなく、
ポインタでやっているのですが、これだと管理が厳しくて。

747 名前:デフォルトの名無しさん :03/10/07 12:40
要素を追加したり削除したりしないなら大丈夫

748 名前:デフォルトの名無しさん :03/10/07 14:08
>>747
おお、ではこういう使い方もありなのですね。
実装依存とか変なのなくて安心しました。レスありがとうございました。

749 名前:デフォルトの名無しさん :03/10/07 15:29
とりあえずVC6での話だけど通常の関数にインライン関数のポインタ渡したら関数が作られていた。
インライン関数にインライン関数のポインタ渡したら展開されていた。
両方がインライン関数、もしくはテンプレートなら展開されると推測・・・大体の場合だけど。


750 名前:デフォルトの名無しさん :03/10/07 16:20
>>749
普通に考えてインライン関数のポインタなんか取れないから、通常の
関数にしていると推測。関数テンプレートも同じ。


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