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


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

C++相談室 part66



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

前スレ
C++相談室 part65
pc11.2ch.net/test/read.cgi/tech/1230341243/

369 名前:デフォルトの名無しさん [2009/04/04(土) 01:06:43 ]
イヒヒ

370 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:11:04 ]
null character

371 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:16:09 ]
>>366
速度的にはどうなんですかね?

372 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:29:43 ]
strchar 一文字単位で文字列終了文字判定
memchar カウンタがアップの判定だけ
どんなコードに落ちるかはCPUのアーキテクチャ次第


373 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:32:54 ]
>>363
速度は実測が基本。

374 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 12:00:41 ]
>>371
全く変わらない。

375 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:33:02 ]
少なくともmemchrがstrchrより遅くなることはないから
出来る限りmemchrを使う

基本的にmem○○とstr○○は常にmem○○優先

376 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:39:43 ]
いいえ。

377 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:48:56 ]
memchrの方が2倍ぐらい遅いよ



378 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 14:04:58 ]
>>377
根拠、或いは計測条件の提示を宜しく。

379 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 14:27:00 ]
二倍なんてもんじゃないよ

380 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:16:31 ]
FreeBSD 7.1-STABLE、Celeron 700MHz(i386)
で計測したらstrchrよりmemchrのほうが5パーセントほど
遅いという結果になりました。
どちらの関数もアセンブリ言語で書かれてあります。

381 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 19:10:53 ]
std::string str="hoge";
const char * const p = str.c_str();

こういう使い方ってして良いの?
このケースではまあ最初からp="hoge"とすれば良いことになるけどもね。


382 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 19:13:10 ]
c_strは使ってはいけない

383 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 19:13:33 ]
>>382
str.c_str()がだめってこと?
どうして?

384 名前:381 mailto:sage [2009/04/04(土) 19:17:19 ]
std::string str="hoge";
const char * const p = str.c_str();

str="piyopiyo";
const char * const q = str.c_str();

std::cout << reinterpret_cast<unsigned long>(p) << "\n" << reinterpret_cast<unsigned long>(q) << std::endl;
結果:pとqが違う値。

このようにstrが変わった時にpが無効になってる可能性はあるよね。
あるサンプルソースで似たようなコードがあって疑問だった。


385 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 19:17:31 ]
>>382はバカ。

386 名前:381 mailto:sage [2009/04/04(土) 19:18:31 ]
>>385
じゃあ気にしないようにするわ。

387 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:39:03 ]
c_str() や data() が返すポンストコインタは
次に const でないメンバ関数が呼ばれるまでの間のみ有効という「時限式」なので
ポインタは保持しないほうがいいよっていうのが一般的な話。
わかってやるなら >>381 自体は違法じゃない。



388 名前:381 mailto:sage [2009/04/04(土) 20:40:56 ]
>>387
分かりやすい説明ありがとう!
理解した。

389 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:03:50 ]
std::string str("");
ってやってるヤツがいるんだが
std::stringはデフォルトコンストラクタでは空文字列にしてくれることが仕様上保証されているんだよね?
つまりstr("")は無駄だよね?


390 名前:デフォルトの名無しさん [2009/04/05(日) 01:12:17 ]
>>389
お前のようにデフォルトコンストラクタの仕様を知らないアホにも空文字列で初期化されることがわかるから無駄じゃない。

391 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:14:46 ]
>>389
動作速度の点では無駄。

392 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:19:08 ]
>>391
だよね。ありがと。

393 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:19:47 ]
速度は実測が基本。

394 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:22:11 ]
優秀なコンパイラで強い最適化オプションを指定していると、勝手にそれくらいは修正してくれないだろうか?

395 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:22:33 ]
そもそも速度を気にするようなところでstd::stringを使うのが間違い。
動作速度でstr("")が無駄と言う奴は馬鹿。

396 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:23:24 ]
>>395
お前も馬鹿。

397 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:24:10 ]
コロッとだまされる>>392が一番馬鹿



398 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:26:00 ]
>>394
優秀じゃなくてもふつうそれくらいするよ。

399 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:30:00 ]
>>397
何がおかしいの?
具体的に言ってみ、お前の脳で言えるのなら。

400 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:33:20 ]
>>399
str("")とデフォルトコンストラクタでは速度に差が無いから>>391はウソ。
以上。

401 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:35:56 ]
もうお前ら全員安価つけてやれ、ホント、マジで頼むから。


402 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:37:19 ]
5レス連続でアンカが付いている件について

403 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:38:58 ]
>>402
いや、その前も含めて全部。

・・・と思ったら俺自身安価付けてなかった
ごめん吊ってくる。

404 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:42:10 ]
>>400
残念ながら同じバイナリに落ち着かない以上、速度に差がないとはいえない。
出直しておいで坊や。

405 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:43:40 ]
何か必死だな。

406 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:47:07 ]
>>390が真理だな。

407 名前:デフォルトの名無しさん [2009/04/05(日) 02:24:22 ]
仲良くしなよ



408 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:30:49 ]
文字列リテラルの使いまわしを認めないコンパイルオプションつけたらちょっとバイナリが増える・・・・・かな?

409 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:55:07 ]
>>404
同じ()バイナリ()落ち着く()
スイーツ()ですか

410 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:57:50 ]
結論

str("")は無駄ではない。

411 名前:デフォルトの名無しさん [2009/04/05(日) 02:58:05 ]
ねーよ

412 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 03:01:33 ]
std::stringはデフォルトコンストラクタでは空文字列にしてくれることが仕様上保証されているんだよね?
なんて醜態晒すくらいなら
std::string str("");
と書く方がよほどスマート。

413 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 04:02:57 ]
次期規格ではstring()はstring("")に委譲する実装になるだろうから
そうなれば本当に速度に差はなくなるだろう
今は知らん

414 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 04:48:42 ]
普通に、こう考えろ

char* str = NULL;
char* str = "";

同じか?w

415 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 07:26:06 ]
全角のアルファベットを打つ奴はゆとり

416 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 07:47:48 ]
全角ってなんですか?

417 名前:デフォルトの名無しさん [2009/04/05(日) 08:47:43 ]
>>353
> mediatorに相当するクラスのヘッダ
の中では前方宣言するのが吉。
そうしないと冗長すぎる依存関係になってしまう。

アプリケーション全体が10kくらいなら気にしないのも有りかも。



418 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 09:12:22 ]

C言語でWEB操作したいです
証券会社にログインして株価を監視して自動売買が目標です
まずはC言語でWEBページを開く方法を教えてください

419 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 09:58:03 ]
>>413
> 次期規格ではstring()はstring("")に委譲する実装になるだろうから
なんでそんなとこ変わるの?

420 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 10:40:31 ]
>>418
WebProg板へどうぞ。

421 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:12:14 ]
>>418
C Web Download をgoogle検索
あきらめろ

422 名前:デフォルトの名無しさん [2009/04/05(日) 13:32:16 ]
>>418
pc12.2ch.net/test/read.cgi/tech/1182323579/

423 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:03:11 ]
デストラクタはpublicで宣言するものだよね?

privateで宣言すると、
まあ普通にコンパイルエラーになるんだけど、
特殊な状況でprivateなデストラクタってある?

なんか俺の知らないイディオムでありそうな気がしてきたんだが。


424 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:16:00 ]
deleteをオーバーロードしてるとかじゃないとコンパイルすら通らなくね?

425 名前:423 mailto:sage [2009/04/05(日) 18:18:06 ]
>>424
そう、通らない。

でも例によってC++は深遠だからさ、
俺が知らないだけで便利なイディオムがあったりするかな〜って興味が出てきた。


426 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:21:59 ]
とりあえずnewで生成してみろよ

427 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:22:20 ]
自動変数や静的変数としては使えないが、newすることは出来る。
deleteはクラスのメンバ関数から出来る。
だから、使えないことはない。具体的にどう役立つのかは分からんが。



428 名前:423 mailto:sage [2009/04/05(日) 18:25:28 ]
あ〜、newで作るのか。
なるほどね。


429 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:26:30 ]
Effective C++にて

const char* const authorName="ScottMeyers";//方式1
const std::string authorName="ScottMeyers";//方式2

この2つが紹介されていたんだけど、結局どっちが良いの?
本によれば方式2の方が良いよ的な書き方されていたんだけど、どうして方式2が良いのか分からない。



430 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:35:41 ]
class MyClass{};
として、
boost::shared_ptr<MyClass> p(new MyClass);
だと大丈夫なのに
boost::shared_ptr<MyClass> p=new MyClass;
だとダメなのは何故でしょうか?

私は宣言時に
(初期化値)とするのと
=初期化値とするのは
等価にコンストラクタを呼び出す物だと思っていたので驚きました。


431 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:38:14 ]
>>430
boost::shared_ptr<MyClass> p=boost::shared_ptr<MyClass>(new MyClass);


432 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:41:49 ]
>>430
コンストラクタに explicit がついていると
> boost::shared_ptr<MyClass> p=new MyClass;
は不可能になる。

例えば
class MyClassA {
 MyClassA(int n);
};
class MyClassB {
 explicit MyClassB(int n);
};
となっていた場合、
MyClassA a(3); // OK
MyClassA a = 3; // OK
MyClassB b(3); // OK
MyClassB b = 3; // NG
となる。

また、
void myFuncA(MyClassA a);
void myFuncB(MyClassB b);
という関数があった場合
myFuncA(3); // OK
myFuncB(3); // NG
となる。myFuncB(MyClassB(3)) は可能。

433 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:42:16 ]
>>431
それはキャストですよね。
つまりキャストしないとダメなんでしょうか?
なぜですか?


…あ、もしかして
boost::shared_ptr<MyClass>のコンストラクタが
explicitになっているということでしょうか?


434 名前:433 mailto:sage [2009/04/05(日) 18:43:20 ]
>>432
すみません。
再読込してませんでした(> <)
失礼致しました。

explicitですね。
もうちょっと勉強して出直してきます。

435 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:44:05 ]
>>430
pc12.2ch.net/test/read.cgi/tech/1232367742/106-109

436 名前:432 mailto:sage [2009/04/05(日) 18:44:11 ]
ごめん、>>432の例だとコンストラクタがprivateになってるね。public: を付け足して読んでほしい。

437 名前:433 mailto:sage [2009/04/05(日) 18:51:15 ]
>>435-436
ありがとうございます。
>newしたらすぐにスマートポインタにセットさせるのが基本。
これがRAIIってやつでしょうか?



438 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:52:46 ]
>>423
カスタムデリータを使うときにデストラクタをprivateにして隠して、カスタムデリータ外から勝手に呼べなくする。


439 名前:423 mailto:sage [2009/04/05(日) 19:03:36 ]
>>438
あーなるほどね。
やっぱあるんだ。
サンクス

440 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:04:47 ]
仮想関数として指定するキーワードvirtualは、どれだけ付けるのが正しい?
例えば
class Base
{
public:
virtual void m_func(){std::cout << "Base m_func!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
};

class Derived : public Base
{
public:
void m_func(){std::cout << "Derived m_func!" << std::endl;};
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};

class Derived_Derived : public Derived
{
public:
void m_func(){std::cout << "Derived_Derived m_func!" << std::endl;};
Derived_Derived(){std::cout << "Derived_Derived Constructor!" << std::endl;};
virtual ~Derived_Derived(){std::cout << "Derived_Derived Destructor!" << std::endl;};
};





441 名前:440 mailto:sage [2009/04/05(日) 21:06:11 ]
んで呼び出す時は
void foo()
{
Base* p=new Derived;
Base* q=new Derived_Derived;
Derived* r=new Derived_Derived;
p->m_func();
q->m_func();
r->m_func();
delete p;
delete q;
delete r;
}

このように、俺はBaseのm_func()にしかキーワードvirtualを付けていないんだが、これであってる?

pc12.2ch.net/test/read.cgi/win/1237525619/127


442 名前:440 mailto:sage [2009/04/05(日) 21:09:30 ]
ごめん
別スレで無礼者がいたから
そいつへレスしようとしてたら
間違ってこっちにリンク張っちまった。>>441

マジごめん。


443 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:17:07 ]
virtualつけたメンバ関数は、派生クラスではvirtualをつけてようがつけてまいが関係なく
仮想関数になる

DerivedもDerived_Derivedもvirtualはつけてもつけなくても一緒


444 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:50:28 ]
>>443
ありがとう。

ちなみにどちらでも同じということだが、その場合
virtualは付ける方が良いとか付けない方が良いとかそういう慣習があったりする?



445 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:54:58 ]
>>440のコードを
Baseでvirtualを付けておき、DerivedとDerived_Derivedではvirtual付けない版と、
Baseでvirtualを付けておき、DerivedとDerived_Derivedでもvirtual付ける版と
両方を作ってビルドしてみた。

g++ -O2 〜〜.cpp

としたのだが、挙動は一緒みたいだが、バイナリは違うものになった。
何故?


446 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:09:48 ]
-Sで試して確かめるならまだしも…

447 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:24:44 ]
>>446
-Sだったら同じバイナリになったわ。
なんで??



448 名前:447 mailto:sage [2009/04/05(日) 22:25:58 ]
>同じバイナリ
→アセンブラコード



449 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:14:09 ]
>>444
C++ Coding Standards では派生クラスでもつけたほうがよいと書いてある。
(38項.安全なオーバーライドを身につけよう)

単に利用者に意図を明確にするためだけどね。

450 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:15:07 ]
速度限界まで最適化するときに
virtualってどう扱うべきなのですかね?

451 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:26:22 ]
@Override みたいなのが欲しいよね

452 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:41:43 ]
そこで属性でしょきっと。

453 名前:デフォルトの名無しさん [2009/04/06(月) 00:43:53 ]
#define override virtualってうちの会社の元Delphi使いな先輩がやってた。

454 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:53:48 ]
>423
遅レスだけど、削除を別のfriend classに委譲する時なんかで使う。

こんなの
class A {
private:
^A() {};
class deleter {
void operator()(A* target) { delete target; };
}
friend deleter;
public:
boost::shared_ptr<A> creator() { return boost::shared_ptr<A>(new A, deleter()); };
}

455 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 17:32:53 ]
class Singleton {
 Singleton() {}
 ~Singleton() {}
public:
 static Singleton& Instance() {
  static Singleton instance;
  return instance;
 }
};
みたいなやり方がどっかに載って無かったかな。

456 名前:423 mailto:sage [2009/04/06(月) 21:40:38 ]
>>454-455
あるのね。
うーん、やっぱ奥が深い。

457 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 11:04:11 ]
関係ないけど
singletonをtempleteにするとctorはpublicにせざるをえないのかな?
よくそういう実装をみかけるけど、新しいインスタンスを作れるのがイヤなのですが



458 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 11:20:52 ]
ctorをprivateにしてsingletonをfriendにすればええがな

459 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 11:22:59 ]
そもそもシングルトンをテンプレートにしてまで量産しようという考え自体が間違いだな。

460 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 19:15:55 ]
CamelCaseにするかcamelCaseにするかcamel_case(underscore_style)にするか、
その基準とか主張とかメリットとかデメリットを知りたいんだが、
みんなどうしてる?
確かBoostは俺の知る限りunderscore_styleだったと思うのだが。


461 名前:デフォルトの名無しさん [2009/04/07(火) 19:27:32 ]
>>459
量産するなんて誰か言ったの?

462 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:02:19 ]
>>461
テンプレートにしているから量産しようとしているとespしたんじゃない?

463 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:05:20 ]
マヌケなespだな

464 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:12:33 ]
どうでもいいがespがスタックポインタに見えてしょうがない

465 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:50:25 ]
ttp://d.hatena.ne.jp/portown/20090318/1237389062
ここで、
>「デストラクタがヘッダ中に記述されてしまっている」ことにある。
>更に言うと、「deleteがヘッダ中に行われてしまっている」ことが問題であり、
>よりつっこんで言うなら「deleteがCHoge::implの定義と別の場所で行われている」ことが問題なのだ。
>つまり、pimplにスマートポインタを使おうとするなら、デストラクタを必ず明示しなければならないのである。
>それも、implの定義(この場合はhoge.cpp)と同じ場所に、だ。
ってあるんだけど、その意味が分からない。
何でダメなの?
つーかコンパイルは一応通ったんだけど。

466 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:52:21 ]
間抜けな設計に合わせてespのレベルも落としたんだろ

467 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:05:05 ]
>>465
まず、「不完全型(名前だけ分かってるけど完全な定義がまだ見えていない型)のポインタのdeleteは危険」
であることを知ってほしい。これはコンパイルは通るけどきちんと動かないことがある。
(その型に自分で定義したデストラクタやoperator deleteがある場合、ちゃんと呼ばれない。)

class CHogeのデストラクタを記述しない場合、コンパイラが勝手に ~CHoge() を作る。
その中でスマートポインタである pimpl のデストラクタが呼ばれ、不完全型であるimplのポインタをdeleteしようとする。



468 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:13:26 ]
未定義動作だからまともなコンパイラなら警告くらい出すはずだけどな
たまたまデストラクタもdeleteも定義してなかったからスルーしちゃったのかな

469 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:53:18 ]
>>467-468
ありがとう。

「pimplがスマートポインタであるために特殊なdeleteが必要である。
だがコンパイル時にはpimplが不完全型であるためにその特殊なdeleteを呼び出すコードが作られない。」
ってことか。

となると、今回のケースでは
CHoge::~CHoge(){}
を自分で明示的に記述したとしても、それをhoge.hに書いている限りは解消されないんだよね。
hoge.cppのCHoge::implクラスの定義の後に自分で明示的に記述するならOKってことですかい?







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

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

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