C++相談室 part93at TECH
C++相談室 part93 - 暇つぶし2ch2:デフォルトの名無しさん
11/12/27 03:01:07.68
■基本■
[C++ FAQ]
 URLリンク(www.parashift.com)
 URLリンク(www.bohyoh.com) (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 URLリンク(en.cppreference.com) (英語)
 URLリンク(ja.cppreference.com) (↑の日本語訳だけどまだ未完)
[Stroustrup]
 URLリンク(www2.research.att.com)
[C++ International Standard]
 URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
 URLリンク(www.open-std.org)
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 URLリンク(www.jisc.go.jp)
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。

3:デフォルトの名無しさん
11/12/27 03:01:21.80
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(episteme.wankuma.com) (※1999年発行注意)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

4:デフォルトの名無しさん
11/12/27 03:01:36.34
■Books■
amazon C,C++関連書籍
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp)

The C++ Programming Language
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Primer (3rd Edition)
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
The C++ Standard Library
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Exceptional C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++ Style
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)

5:デフォルトの名無しさん
11/12/27 03:01:46.07
■Books(Templateまわり)■
Effective STL
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
 URLリンク(www.amazon.com)
C++ Template Metaprogramming
 URLリンク(www.amazon.com)

6:デフォルトの名無しさん
11/12/27 03:02:14.47
テンプレここまで。あと続けたい人は好きにして。

7:デフォルトの名無しさん
11/12/27 03:02:44.67
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

8:デフォルトの名無しさん
11/12/27 03:06:49.86
>>6
まだ終わってないぞ

壁紙にしてね!
URLリンク(www2.research.att.com)

9:デフォルトの名無しさん
11/12/27 03:21:31.15
おつ

10:デフォルトの名無しさん
11/12/27 07:33:10.63
>>7は根強い人気だな

そう言えばランタイムライブラリのDLLって
テンプレートでも std::vector<int> とか基本的なものくらいは
含んでたりするんだろうか?

11:デフォルトの名無しさん
11/12/27 07:59:16.56
テンプレートはないだろ

12:デフォルトの名無しさん
11/12/27 08:42:33.23
本当にテンプレートを使ったことがあれば、
exportが無謀って事はすぐにわかるだろ。

13:デフォルトの名無しさん
11/12/27 09:33:16.13
friendクラスとクラス内クラスってどういった違いがあるんでしょうか
class Hoge {
friend class FactoryA;
class FactoryB;
private:
Hoge(int init);
// ry
};

class FactoryA {
private:
int i;
public:
FactoryA(void) : i(0) { }
Hoge * Create(void) { return new Hoge(++i); }
};


class FactoryB {
private:
int i;
public:
FactoryB(void) : i(0) { }
Hoge * Create(void) { return new Hoge(++i); }
};

パッと見どちらとも同じような気がするのですが

14:デフォルトの名無しさん
11/12/27 09:39:18.43
コンパイル通らんだろそれ

15:デフォルトの名無しさん
11/12/27 11:41:47.45
静的に関数を呼びだせば体が空の関数は最適化によって
何も無いようになりますか?

16:デフォルトの名無しさん
11/12/27 11:57:27.42
>>15 コンパイラの実装や設定次第。試せ。

17:デフォルトの名無しさん
11/12/27 12:13:57.34
C++0xに関数を定数にする機能あったじゃないですか?
それ使えば出来ませんか?
factoryをテンプレート型として
体が空のときはその機能を使い
factory.a()は右辺値の定数だから
何もすることが無いみたいなこと
なりませんか?

18:デフォルトの名無しさん
11/12/27 12:19:30.84
constexprはコンパイルタイムにガーッと計算して結果を埋め込む機能だけど。

小さい関数はインライン展開を期待したほうがいいんじゃないか?

19:デフォルトの名無しさん
11/12/27 12:25:12.63
>>15,17
最適化するもなにも、空の関数はそもそも何もしないので、
ちょっと何言ってるかわからないですね。

20:デフォルトの名無しさん
11/12/27 12:29:47.59
空の関数はスタックに引数を詰んだりするんですよ?

21:デフォルトの名無しさん
11/12/27 12:34:07.58
>>20 >>16

22:デフォルトの名無しさん
11/12/27 12:50:46.39
くだらないこと言ってないでさっさとアセンブラコード見ればいいと思うの

tmp> g++ -S test.cc && cat test.s

23:デフォルトの名無しさん
11/12/27 13:39:49.61
struct A{
typedef int type;
};
struct B : A{
type a;
} b;

&bと&(b.a)が同じアドレスをさしてほしいのですが
データメンバのないクラスを継承したときに
サイズが増えないようにする方法はありませんか?

24:23
11/12/27 13:55:22.69
データメンバがなく
関数だけが定義してあるクラスを複数継承したら
サイズがどんどん増えていってしまいました。

URLリンク(sites.google.com)
これとは少し違うのですが、これも演算子だけが定義してある
クラスを継承していると思うのですが
この場合はサイズが増えてしまうのでしょうか?
それとも増えないようにする方法があるのでしょうか?

25:デフォルトの名無しさん
11/12/27 15:18:15.80
>>23
Aは空クラスなのでサイズ1
Bは変数があるからそのサイズになる

なのでサイズは必ず増える


26:デフォルトの名無しさん
11/12/27 15:25:55.72
あと、Aは継承時にはサイズ0として扱われるはずなので、
&b == &b.a
になると思うんだが

27:デフォルトの名無しさん
11/12/27 15:28:35.33
0にするかどうかはコンパイラの最適化次第じゃなかったか

28:デフォルトの名無しさん
11/12/27 15:32:00.59
>>23
template <class Derived> class A {
protected:
~A(void) { }
public:
typedef int type ;
} ;

class B : public A<B> {
public:
type a ;
} ;

とりあえずこう書いてあとはコンパイラの気分しだい

29:23
11/12/27 15:34:12.73
空クラスであるにもかかわらず
継承時にサイズが0として扱われない条件というのがあるのでしょうか。

情報の後出しになってしまい申し訳ないのですが

template<typename T>
struct ptr_convertable{
operator T*(){
return *(T**)this;
}
};

struct my_int_ptr : ptr_convertable<int>{
int *p;
};

int a;
my_int_ptr b;
b.p = &a;
int *c = b;

こういう感じのことをやろうとしています。

30:23
11/12/27 15:47:37.76
struct A{};
struct B : A{};
struct C{ operator int(){} };
struct D : C{};
struct E : B, D{};
struct F{int a;};
struct G : F{};
struct H : E, G{};
struct I : G, E{};

int a = sizeof(A); //1
int b = sizeof(B); //1
int c = sizeof(C); //1
int d = sizeof(D); //1
int e = sizeof(E); //1
int f = sizeof(F); //4
int g = sizeof(G); //4
int h = sizeof(H); //5
int i = sizeof(I); //5

クラスの内容にはあまり関係ないようです。

31:23
11/12/27 15:55:00.89
すいません、更新せずに書き込んでしまいました。

>>27 >>28
protectedデストラクタを書いてみましたが結果は変わりませんでした。

変換対象のクラスが多いので、こうすれば1行で書けるかと思ったのですが
なんか別の方法はないでしょうか。

マクロであきらめようかな。

32:デフォルトの名無しさん
11/12/27 17:11:35.93
>>31
多重継承で親が重なる場合に増えてるね。


33:デフォルトの名無しさん
11/12/27 17:39:37.10
まさか関数ってvirtualの?
それだと仮想関数テーブルの分どんどん増えると思うけど。

34:デフォルトの名無しさん
11/12/27 19:30:47.70
>>20
最適化してバックトレースとってみ。
リンケージが同じなら消失するから。

35:デフォルトの名無しさん
11/12/27 19:34:47.21
>>29
つかアドレス一緒にして何するつもりよ


36:デフォルトの名無しさん
11/12/27 20:19:02.71
>>32
> 多重継承で親が重なる場合に増えてるね
全ての基底クラス部分を区別できる形で表現できる必要があるからな。

struct B {};
struct D1 : B {};
struct D2 : B {};
struct D12 : D1, D2 {};

D12 * pd12 = new D12; // 1
D1 * pd1 = pd12; // 2
D2 * pd2 = pd12; // 3
B * pbd1 = static_cast<D1 *>(pd12); // 4
B * pbd2 = static_cast<D2 *>(pd12); // 5

1と2,3は型が違う。4,5は型が同じなのでアドレスを変えて違いを出す。

37:デフォルトの名無しさん
11/12/27 20:19:50.47
何かトリッキーな事でもしたいんじゃね

C++はどうしてもCより抽象度が高くなるからアドレス関係をいじると
あまり無茶は出来ないよな

38:デフォルトの名無しさん
11/12/27 20:34:58.10
平松邦夫/民主党
大阪市役所・自治労・大阪市労働組合・日教組・大阪市教育委員会・自民党・共産党・社民党・関西電力・住友グループ
・毎日放送・毎日新聞・関西経済連合・日本原子力発電株式会社 ・ 週刊文春・週刊新潮・NHK・朝日新聞・読売新聞
・部落解放同盟・朝鮮総連・在日本大韓民国民団・日本遊技関連事業協会・全日本遊技事業協同組合連合会・日本弁護士連合会・生活保護受給者・反日左翼・9条の会・革マル派・中核派

VS

橋下徹/維新の会
大阪市民・みんなの党・国民新党・亀井静香・石原慎太郎・東国原英夫
 様子見:公明


39:デフォルトの名無しさん
11/12/27 21:12:02.53
>>12
exportじゃなくて明示的実体化の話だよ

40:デフォルトの名無しさん
11/12/27 22:50:38.50
>>39
それとDLLだけとじゃさっぱり分からんのですけど。

41:デフォルトの名無しさん
11/12/28 01:26:43.45
>>40
明示的な実体化を行うと、別リンケージに関数の実体が生成される。
DLLでも同じ話。実体がある以上他のDLLやEXEで使用できる。

てか、このへんは初歩的な話じゃ・・・


42:デフォルトの名無しさん
11/12/28 01:41:31.98
>>29
それ、結局派生側の指定位置に生の T* をメンバで持つことを強要してんじゃん。
ptr_convertable が T* 持てば全て自然に解決する話じゃないの?

43:デフォルトの名無しさん
11/12/28 01:42:13.22
>>37
CにできてC++にできないアドレス操作なんて無いだろ。

44:デフォルトの名無しさん
11/12/28 05:14:11.43
>>43
いやそういう意味じゃない
Cだと構造体の中に何かを入れて後から伸ばすとか割りと見えやすかったけど
C++のクラスで同じ事をしようとすると仮想関数やら大きさ最低1バイトの縛りやら
あと継承なんかしていたら伸ばそうとした途端に他のメンバが壊れたり
いろいろ気を使うという事を言いたかった

45:デフォルトの名無しさん
11/12/28 06:28:37.89
>>44
配列以外のアドレス(ポインタ)加減算がCなら安全なことがあると思ってるんなら
おおかたただの勘違い。規格上認められる操作は大差ない。

たまたまプログラマの間違った期待どおりに動いてしまうことがCのほうがいくらか
多い(C++のほうがいくらか少ない)というだけのこと。

実際の違いと言えるところとして可変長配列と構造体中の 0 長配列メンバがあるけど、
それらも「抽象度」がどうのこうのではない。
URLリンク(seclan.dll.jp)

46:デフォルトの名無しさん
11/12/28 06:38:56.59
そうなのか
vtableとかどこにくっついているか実装依存なので扱いにくいのではと思ったんだけど

47:デフォルトの名無しさん
11/12/28 07:06:16.11
>>46
vtable以外にも、オブジェクトのレイアウトに関して実装依存なことはパディングやら
アライメントやらCの範囲でもいくらでも考えられるからね。

URLリンク(www.kouno.jp)
> 16.5: このプログラム、あるマシンではうまく走るのに、別のマシンだと変 な結果を返す。もっと変なことに、デバッグ用の出力を付けたり外し たりすると症状が違ってくる。
> A: おかしくなる可能性のあるものはたくさんある。以下に可能性の高い ものをいくつか示す。
...
> 対象となる具体的なシステムで コードの生成されかたを決 め付けて、こういう使いかたを考え付くとは俺って頭がいい なと思っていることはなんでも

48:デフォルトの名無しさん
11/12/28 07:09:56.13
Cは継承や仮想継承、仮想関数がないからそれだけでもC++よりは扱いやすい
構造体だと思ったんだが

>>47のリンクは知ってる
トリッキーな事をすると必ずリスクは付いて回る
しかしC++はそのトリッキーな事が致命的な結果をもたらす率が高いと思う

49:デフォルトの名無しさん
11/12/28 07:31:04.25
>>45
反応する所が違うだろ
クラスに対してトリッキーな事(強制キャストが必要な操作)を
すんなってのが要点なんだから。
別にPODなコードは絶対安全とかそんな話を
してるわけじゃないだろ。


50:デフォルトの名無しさん
11/12/28 07:43:35.04
>>49
まあいいだろ
俺は前スレからの流れで書いたつもりだったんだが汲んでもらえなかったようなので
クラスはPODにいろいろ厄介な物が(もちろんメリットの方が遥かに大きいが)付いているので
あまり変な事はしない方がいいよって意味で書いた

PODも規格外の事をすれば当然危ない
当たり前の事だよな

51:デフォルトの名無しさん
11/12/28 07:45:26.57
無茶なキャストやアドレス操作をすることを前提にして
問題を起こす率の高い低いを考える意味がわからんな。
まぁ「思う」のは自由だよね。

52:デフォルトの名無しさん
11/12/28 08:44:15.45
>>10
文字列関係は大体入ってた。complexやnumeric_limitsなんかも入ってることはあるな。

53:デフォルトの名無しさん
11/12/28 09:00:15.72
>>51
いやだから「規格外」である事は承知で、Cで無茶をして動かしている例はいくらでもある
プログラム組んだ事ないのか?
でもC++でそれをやろうとするとほとんど不可能になると言いたいだけの話
お前アスペだろ

54:デフォルトの名無しさん
11/12/28 09:09:48.07
C++でも規格外なコードは書けるし書かれまくってるだろ
ラップするから見えないだけで

55:デフォルトの名無しさん
11/12/28 12:33:24.42
駄目だこいつ
相手しないでおこう

56:デフォルトの名無しさん
11/12/28 12:35:38.71
>>55
>>55

57:デフォルトの名無しさん
11/12/28 13:24:02.68
56 名前:あぼ~ん[あぼ~ん] 投稿日:あぼ~ん

58:デフォルトの名無しさん
11/12/28 13:38:54.97
57 名前:チンカス[sage] 投稿日:臭い

59:デフォルトの名無しさん
11/12/28 15:31:31.63
>>47
そういや、vtableなんてポインタじゃ無くても実装できるしな。
動的リンクを考えなきゃ、コンパイラが全てのクラスのvtableを
直列した配列にして、オブジェクトには、その配列のオフセットを
持たせるだけってのでもいいわけだしな。

60:デフォルトの名無しさん
11/12/28 17:35:07.64
仮想関数のテンプレート化はできないんでしょうか?
class Hoge {
public:
template <class Iterator>
virtual void Func1(Iterator begin, Iterator end) = 0 ;
template <class Inserter>
virtual void Func2(Inserter inserter) const = 0 ;
} ;
class HogeEx : public Hoge {
std::vector<int> v;
public:
template <class Iterator>
void Func1(Iterator begin, Iterator end) { v.assign(begin, end); }
template <class Inserter>
void Func2(Inserter inserter) { inserter = v.front(); }
}
みたいな感じで主にイテレーター関係やファンクタを引数に取る関数で使いたいんですけど

61:デフォルトの名無しさん
11/12/28 17:41:09.06
ああそれね。そういうのウチはやってないから。

62:デフォルトの名無しさん
11/12/28 17:54:03.06
何か朝から頭のおかしい粘着がいるなあ

>>60
標準C++の仕様では出来ないけど、boostを使うとそれらしいのは出来るみたい

URLリンク(d.hatena.ne.jp)

63:デフォルトの名無しさん
11/12/28 18:27:38.15
>>62
それっぽくできました
ありがとうございます

64:デフォルトの名無しさん
11/12/29 01:17:05.61
相談
C++(C)でdllのリソースファイルとして.txtファイルを埋め込んで、そこから文字列を取り出すにはどうしたらよいですか?
検索しても出てこないのはもしかして当たり前のこと過ぎるからでしょうか・・・

65:デフォルトの名無しさん
11/12/29 01:37:47.41
C/C++にそのような機能はないのでなんらかのAPIを使う

66:デフォルトの名無しさん
11/12/29 01:41:34.87
>>64

ID_SAMPLE     TEXT_DATA         DISCARDABLE     "text.txt"
リソース名       リソースグループ  DISCARDABLE      "ファイル名"

URLリンク(www.sm.rim.or.jp)

67:デフォルトの名無しさん
11/12/29 02:01:52.43
WindowsならWin32スレいけ、っていえるほどあそこいいところじゃないからとりあえずはっとく

BOOL CALLBACK 探すコールバック( HMODULE hModule, LPCWSTR lpType, LPWSTR lpName, LONG_PTR lParam )
{
 HRSRC hrsrc = FindResource( hModule, lpName, lpType );
 if( hrsrc ) {
   void* data = LoadResource( hModule, hrsrc );

   if( data ) {
     hoge* pwork = (hoge*)lParam;
     strcpy( pwork->hage, data );
   }
 }
 return TRUE;
}

void 探す関数()
{
 hoge work;

 HMODULE hModule = LoadLibrary( "dllのパス" );
 if( hModule ) {
   EnumResourceNames( hModule, RT_STRING, 探すコールバック, (LONG_PTR)&work );

   FreeLibrary( hModule );
 }
}

あぁ、ファイル埋め込みならRT_STRINGじゃなくてRCDATAか

68:デフォルトの名無しさん
11/12/29 02:13:11.19
ありがとう

69:デフォルトの名無しさん
11/12/29 06:17:59.89
>>65
分からないのなら黙ってろよカス

70:デフォルトの名無しさん
11/12/29 09:08:42.19
>>65-67
ありがとうございます
なるほど、やはり一発でポンというのはないのですね
またわからないことが出来たらよろしくお願いします

71:デフォルトの名無しさん
11/12/29 09:25:50.01
複数の配列を合併してひとつの配列をつくりだすことに
もっとも適したデータ構造をおしえてください。

72:デフォルトの名無しさん
11/12/29 10:19:04.72
配列とそのポインタの配列。

73:デフォルトの名無しさん
11/12/29 10:20:11.71
RopeかFingerTreeあたりか

74:デフォルトの名無しさん
11/12/29 11:43:51.93
std::vector<std::vector<>>

75:デフォルトの名無しさん
11/12/29 11:50:20.64
2重配列のやつだと同じ要素が2つあるやつの合併は処理が困っちゃいますよね。

76:デフォルトの名無しさん
11/12/29 11:50:43.96
それは重くなる。

std::vector<std::vector<>*>にしとくべき。
ポインタだけならサイズ変更しても負荷は小さい。

77:デフォルトの名無しさん
11/12/29 11:52:02.05
普通、連結と言ったら要素は重複しても、単に前か後ろにつなげるだけだ。

78:デフォルトの名無しさん
11/12/29 12:05:26.22
>>71
vectorのリストがいいよ
先頭のベクタの長さをNとする
先頭を除いたベクタのリストの長さが合計で2Nに達したら
先頭を倍+αに伸ばしてそこに先頭を除いたベクタの内容をコピーして先頭以外を解放する

79:デフォルトの名無しさん
11/12/29 12:09:31.82
union-find木

80:デフォルトの名無しさん
11/12/29 12:29:23.89
要素の重複は削り、順序は無視して良いならstd::setに入れとけ。

81:デフォルトの名無しさん
11/12/29 13:07:34.03
mapで使えるやつがないな。
メモリ食いすぎる。
STLportがマシだが。
Googleとか頻繁に更新してるのにSTLportのメモリと速度に追いつけず。

82:デフォルトの名無しさん
11/12/29 13:20:46.52
同条件で比較したmapの性能。stlport_std::hash_mapが全てにおいて優れて他のやつ使う余地がないな。

stlport_std::hash_map
Insert Time: 8.859 sec. Search Time: 2.875 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB

stlport_std::map
Insert Time: 12.265 sec. Search Time: 14.953 sec.
ページフォールト数: 11422 最大ワーキングセットサイズ: 46846.0KB

std::map VC9
Insert Time: 14.078 sec. Search Time: 13.953 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB

stdext::hash_map VC9
Insert Time: 10.109 sec. Search Time: 7.5 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB

google::sparse_hash_map ver.1.12
Insert Time: 51.921 sec. Search Time: 9.407 sec.
ページフォールト数: 11949 最大ワーキングセットサイズ: 48664.6KB

google::dense_hash_map ver.1.12
Insert Time: 10.14 sec. Search Time: 5.375 sec.
ページフォールト数: 29635 最大ワーキングセットサイズ: 82599.9KB

83:デフォルトの名無しさん
11/12/29 13:24:36.39
自分の環境はスペックであることは書いておかなければいけなかった。物理メモリが1ギガしかない。
消費メモリサイズには影響は無いと思うが、ページフォールトによる速度低下はあり得る。
google::dense_hash_mapなどはメモリ食うから、容量が大きいマシンでつかったら速度は一番になり得る。

84:デフォルトの名無しさん
11/12/29 14:16:07.33
これがコピペだと気付くのに時間かかった

85:デフォルトの名無しさん
11/12/29 14:42:32.01
コピペだけど自作データだが。

86:デフォルトの名無しさん
11/12/29 15:10:51.18
再試+テストコード公開よろ
ここに貼るのが無理でもblogの方にでも貼っていただければ

87:デフォルトの名無しさん
11/12/29 15:35:18.00
こんなのだが。map部分は書き換える。
#include <string>
#include <time.h>
#include <unordered_map>
#include <windows.h>
#include <psapi.h>
#pragma comment (lib, "psapi.lib")
using namespace std;
int InsertNum=500000, SearchNum=4000000; double timer();string strgen();void meminfo();
int main() {
tr1::unordered_map<string,int> hmap; int i; timer();
for(i = 0; i < InsertNum; i++) hmap.insert( make_pair( strgen(), i ) );
printf("Insert Time: %fsec.\n", timer());
timer(); for(int n=0; n<100; n++) {
string find = strgen();
for(i = 0; i <= SearchNum/100; i++) hmap.find(find); }
printf("Search Time: %fsec.\n", timer());
meminfo(); }
double timer() { static int n=-1; static unsigned int cl[2];
if(n==-1) { n=0; cl[0]=clock(); return 0; }
n=1-n; cl[n]=clock(); return (cl[n] - cl[1-n]+0.0)/CLOCKS_PER_SEC; }

unsigned int randxor() { static unsigned int t, x=123456789,y=362436069,z=521288629,w=88675123;t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
string strgen() { string str; for(int j = 0; j < 1+randxor()%4; j++) {
int r=randxor(); for(int n=0; n<32; n+=2) str+=(char)('a'+(r>>n)%4); }
return str; }
void meminfo() { PROCESS_MEMORY_COUNTERS memInfo = {0};
GetProcessMemoryInfo( GetCurrentProcess(), &memInfo, sizeof(memInfo) );
printf("ページフォールト数: %d\n", memInfo.PageFaultCount);
printf("最大ワーキングセットサイズ: %0.1fKB\n", 0.001*memInfo.PeakWorkingSetSize);
printf("最大ページングファイル使用サイズ: %0.1fKB\n", 0.001*memInfo.PeakPagefileUsage);}

88:デフォルトの名無しさん
11/12/29 21:58:38.76

| ┏━━┓   従軍慰安婦は反日朝日新聞の捏造でした。
| ┃借収安┃    デマだらけの報道に注意しよう
| ┃三三婦┃
| ┃○○大┃
| ┃○○募┃
| ┃○圓集┃
| ┃圓以  ┃
| ┃迄上  ┃_
\┃可   ┃ \
  ┗━━┛  \
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
URLリンク(img04.ti-da.net)


89:デフォルトの名無しさん
11/12/30 02:29:27.45
stlportのhash<string>はあんまり質が良くないから気をつけたほうがいいかも

90:デフォルトの名無しさん
11/12/30 22:49:56.84
たまに衝突してもいいというマップだと省メモリ・高速にできるな。

91:デフォルトの名無しさん
11/12/31 09:36:49.83
listのmergeって内部のデータを盗むやつだから
新たにデータをつくりませんよね?
あと順序を維持したままというのはmergeすると
ソートが勝手に行われるということですか?
単純に後ろにくっ付けたいときはどうしたらいいですか?
あとdequeやvectorで2つのやつを新たなデータを作らずにマージできますか?

92:デフォルトの名無しさん
11/12/31 10:04:40.11
listはデータ構造的にたまたまそういうことができるだけ
STLのほかのコンテナでは無理
setやmapならできそうな気もするけどSTLには残念ながらそういう機能はない
ソートせずにくっつけたいだけならspliceを使う

93:デフォルトの名無しさん
11/12/31 10:11:47.79
配列のポインタを保持してそれでつなげ。
そしたら低負荷だ。

94:デフォルトの名無しさん
11/12/31 10:17:15.52
派生クラスのコンストラクタを自動でprotectedにするテクニックってありますか?
派生可能かつ生成関数を通じてのみ生成可能なクラス群を書きたいのだけど
いちいち全クラスにprotectedコンストラクタを書くのが面倒です
(例)
class X {
protected:
// CTORS
virtual ~X(void) {};
public:
static X * Create(void) { return new X; }
};
class Y : public X {
protected:
// CTORS
public:
static Y * Create(void) { return new Y; }
};
class Z : public Y {
private: // final的な意味で
// CTORS
public:
static Z * Create(void) { return new Z; }
};

95:デフォルトの名無しさん
11/12/31 11:32:10.13
配列の配列がdequeってかいてあったからマージできるとおもったけど
出来ないんですね。
おとなしくvector型の配列つくりますね。

96:デフォルトの名無しさん
11/12/31 13:05:16.37
>>94
無理じゃね
そもそも何でコンストラクターはダメで
Createならいいの?

97:デフォルトの名無しさん
11/12/31 13:11:33.81
>>96
enable_shared_from_thisとかその他のフックがついてる時
あるいはCreateでマネージャに登録などの他の処理もしてる時
とかですかね

98:デフォルトの名無しさん
11/12/31 17:24:46.05

URLリンク(cp2.uh-oh.jp)
URLリンク(cp2.uh-oh.jp)

テレビに騙されるな(自称街の人-台本読んでるだけの業者)


99:デフォルトの名無しさん
12/01/01 10:33:04.62
寿命の管理の責任ははっきりしているけれど共有したいポインタがあるから
unique_ptrのweak_ptrみたいなものが欲しいのだけどそういうイディオムとかって有りませんか?

100:デフォルトの名無しさん
12/01/01 11:22:44.36
unique_ptrを参照渡しする

101:デフォルトの名無しさん
12/01/01 13:20:36.24
#include <memory>
#include <iostream>
#include <stdexcept>

template<typename T> void f(std::unique_ptr<T> const& p) {
if (p.get()) {
std::cout << *p << std::endl;
} else {
throw std::invalid_argument("no ownership");
}
}

int main() {
std::unique_ptr<int> p(new int(0));
f(p);
std::unique_ptr<int> q = std::move(p);
try { f(p); }
catch (std::invalid_argument const&) {
std::cerr << "p lost ownership" << std::endl;
}
f(q);
}
こんな使い方していいのだろうか・・・

102:デフォルトの名無しさん
12/01/01 14:08:38.33
参照だけではウニポが無効になったことを検知できない

103:デフォルトの名無しさん
12/01/01 16:37:02.96
unique_ptrがscope outしたらそもそも見えない
std::moveで他のunique_ptrに所有権が移ればget() == nullptrになる
それ以外で無効になるときってどういうのがありますか?

104:デフォルトの名無しさん
12/01/01 16:53:04.58
明示的に開放した場合

105:デフォルトの名無しさん
12/01/01 17:23:22.11
>>104
なるほど明示的な開放ですか、確かに弱参照っぽく使うとなるとそういうケースも当然考えられますね

そこでこの操作をunique_ptrのデストラクタにおける所有権放棄+リソースの解放を手作業で行うものと見做して
rp = p.release();とした後にp.get_deleter()(rp);としましたが、その直後のpはreleaseの仕様よりp.get() == nullptrとなり
unique_ptrの参照から無効となったことを検出できているようですが、これでは駄目なのでしょうか?
これ以外にはdelete p.get();のような対処不可能なものしか考えられないんですが、他にも見落としがあるという気もします

106:デフォルトの名無しさん
12/01/01 17:29:54.06
ユニポに割り当てられていたメモリが最利用されて他のオブジェクトで上書きされた時

107:デフォルトの名無しさん
12/01/01 18:38:38.48
なるほど、やはり排他付きのshared_ptrとweak_ptrでやった方が楽そうですね


108:デフォルトの名無しさん
12/01/02 00:16:22.68
便乗してshared_ptrに関する質問なんだけど、

void SetValue(const shared_ptr<Value> & value) { ... }
みたいな引数のconst参照渡しは認められているけど、

const shared_ptr<Value> & GetValue() const { ... }
みたいなconst参照返しは認められていないのはなぜ?

109:デフォルトの名無しさん
12/01/02 00:20:28.94
べつに認められてないことはないよ

110:デフォルトの名無しさん
12/01/02 00:23:02.84
>>108
それでも、問題ないと思うけど、
shared_ptrは自身のコピーを作るときにカウント増やすのであんまり参照返しにする意味はないと思う。

111:デフォルトの名無しさん
12/01/02 05:22:03.18
なるほど、大丈夫なのか

shared_ptrを参照返しするばあい、
shared_ptrのポインタ(参照)を取得→参照返し→呼び出し側の処理
だから、呼び出し側の処理で参照カウントのインクリメントをする前に、
参照カウントが0になるような処理が他のスレッドとかで発生する(するのか?)とまずいと思ったんだけど・・・

shared_ptrを値返し(shared_ptr<Value> GetValue() const)するばあい、
参照カウントのインクリメント→値返し→呼び出し側の処理
だから、途中でカウントが0になることはあり得ないという考え

112:デフォルトの名無しさん
12/01/02 05:37:37.05
値返しでも
・GetValue呼び出し
・他スレッドで内部スマポを破棄
・GetValueの戻り値コピー(空スマポが返る)
という順番になる可能性はある。

113:デフォルトの名無しさん
12/01/02 07:20:55.20
おお、確かにあるわな
つまるところ微妙に大きい構造体のメンバ変数を値返しするか、参照返しするかの違いか

114:デフォルトの名無しさん
12/01/02 08:52:45.66
スレッドAにスマポを保持
スレッドBにスマポを保持
この時点でカウントは2
スレッドA内のスマポ保持者が同じスレッドにスマポを参照で返そうが値で返そうが問題ない
返してる途中でスレッドB内のスマポが破棄されてもカウントは1以上と保証されてる
やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること
まあそんなことする奴はいないと思うが

115:デフォルトの名無しさん
12/01/02 09:25:55.29
std::list<int[2}>は作れますか?
作れなければどうしたら好いですか

116:デフォルトの名無しさん
12/01/02 09:44:22.44
struct a { int a[2]; }
list<a>

117:デフォルトの名無しさん
12/01/02 12:12:05.55
>>115
なんでstd::list<int[2]>なんですか?
std::list<int>じゃダメなんですか?

118:デフォルトの名無しさん
12/01/02 15:02:12.31
そこはstd::list<std::pair<int, int>>で

119:デフォルトの名無しさん
12/01/02 16:26:27.80
boost::arrayなら入れられる

120:デフォルトの名無しさん
12/01/03 01:03:05.84
>>144
>やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること
参照返しはダメだとして、値返しならスレッドセーフになる?
あと、スレッド間の参照渡しも危ない?

BOOST_SP_DISABLE_THREADSを宣言したばあい、スレッド間での
・値渡し
・参照渡し
・値返し
・参照返し
の動作はどうなりますか?

121:デフォルトの名無しさん
12/01/03 12:16:23.78
class Base{
コンストラクタとデストラクタ
}

class Super:Base{
コンストラクタ1
コンストラクタ2
}

コンストラクタ1:Baseコンストラクタ{
(コンストラクタ2をオーバーロード)
}

コンストラクタ2:Baseコンストラクタ{
...
}

こうすると、コンストラクタ1を呼び出した時、多分そのスコープを抜けるときにBaseのデストラクタを呼び出して
困ったことになるんですが回避方法はありますか?

122:121
12/01/03 12:39:01.09
ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね
コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました

123:デフォルトの名無しさん
12/01/03 13:10:23.46
>122
>コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました
多分、対処はそれで正しい。が、

・オーバーロードって用語、意味間違ってるんじゃね?
・Super→Sub あるいは Base→Derived なので Base、Super って書かれるとはぁ?って感じがする
・コンストラクタの中で他のコンストラクタを呼び出すことは出来ない。多分、一時オブジェクトを生成してるだけ。
struct Derived : Base
{
  Derived() : Base() {}
  Derived(int n) : Base()
  {
    Derived(); // 一時オブジェクトを生成してるだけ
  }
};
・「ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね」
 標準ライブラリでも普通にオーバーロードしてると思うが。

124:デフォルトの名無しさん
12/01/03 14:20:14.86
C++ 11
delegating constructor


125:デフォルトの名無しさん
12/01/03 15:59:58.36
ちょっと質問です。

char c[4] = {'a','\0','*','*'};

c は文字列を表していますが、実際は 4byte 固定のバイナリデータで、\0 の後ろにはゴミが入っています。
3文字以下の場合は \0 終端が保証されていますが、4文字ちょうどの場合は \0 終端されていません。
この c を std::string に変換するにはどうすればいいでしょうか。

案1:
std::string s = std::string(c);

これだと、\0 終端していない場合はうまく変換できません。

案2:
std::string s = std::string(c, 4);

これでうまく行くと思ったのですが、続けて s += "def"; とすると、
s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。
理想では a d e f \0 となってほしいです。

自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。
よろしくお願いします。

126:デフォルトの名無しさん
12/01/03 16:23:21.44
>>125
これくらいしか思いつかん
std::string s = std::string(c, 4);
s.resize(strlen(s.c_str()));

127:デフォルトの名無しさん
12/01/03 17:32:43.18
string s(string(c, 4).c_str());

128:デフォルトの名無しさん
12/01/03 17:41:00.83
>>127
ああーーそれだ!
うまく行きましたありがとうございます!!

129:デフォルトの名無しさん
12/01/03 21:44:10.55
>>125
std::string s(c, std::find(c, c + 4, '\0'));

130:デフォルトの名無しさん
12/01/03 22:17:51.09
string自体に超最適化されたfindメンバがあるのに、どうして効率の低いアルゴリズムをわざわざ使いまんのや。

131:デフォルトの名無しさん
12/01/03 22:44:30.53
stringのfindメンバとやらで>129をもっと効率よくできるの?

132:デフォルトの名無しさん
12/01/03 22:47:03.31
C++ Coding Standards
「時期尚早の最不適化をしてはならない」原則に反する。
要するに糞コードを書くなってことだろ。

133:デフォルトの名無しさん
12/01/03 22:50:13.20
それとも Effective STL の「アルゴリズムより同名のメンバ関数を優先して使おう」だろうか。
どっちにしてもそんな初心者向けのルールすら無視して糞コード書いちゃだめだな。

134:デフォルトの名無しさん
12/01/03 23:30:38.66
どれを指して糞コードって言ってるの?良いコードはどんなの?

135:デフォルトの名無しさん
12/01/03 23:35:34.78
同名とはいえ可換じゃない関数でそんなこと言われても

136:デフォルトの名無しさん
12/01/03 23:48:31.98
当たり前すぎて議論するようなレベルの話じゃないが
理由を知りたいなら Effctive STL にも C++ Coding Standards にも載ってるからそれ読めれ。
っていうか、回答者なんだから知ってて当然だと思うんだけどどーなの?

137:デフォルトの名無しさん
12/01/03 23:56:50.99
>>131
大して変わらないと思うけど例えば

char c[4] = {'a', '\0', '*', '*'};

std::string s = std::string(c, 4);

std::cout << s << " length: " << s.size() << std::endl;

s.resize(s.find('\0'));

std::cout << s << " length: " << s.size() << std::endl;

138:デフォルトの名無しさん
12/01/04 00:09:20.40
それじゃ\0が含まれないとき死ぬだろ

139:デフォルトの名無しさん
12/01/04 00:16:29.56
あそっか、string::nposをチェックしないと行けないのか

s.resize((s.find('\0') == std::string::npos) ? s.size() : s.find('\0'));

なんか格好悪いなあ

140:デフォルトの名無しさん
12/01/04 00:18:31.63
if文で単純に分岐させた方がいいな

std::string::size_type si = s.find('\0');

if (si != std::string::npos)
s.resize(si);

141:デフォルトの名無しさん
12/01/04 00:39:53.13
すみません。以前こちらで仮想デストラクタについて質問したものです。
簡単な参照カウンタつきnew/delete を実装したく、Web ページをあさっていたのですが、delete/new の演算子オーバーロードのサンプルをみるかぎり、
class A {
static void *operator new(size_t size) { malloc(size); }
static void operator delete(void *p) { free(p) }
};
という感じで、new/delete の中身は malloc()/free() になっているものしか見当たりませんでした。
これを <cstdlib> を使わずに c++ だけで完結させたいのですが、どうすればいいでしょうか。new/delete をオーバーロードした以上、malloc()/free() 呼び出しは不可避なのでしょうか。
キーワードをいただければありがたいです。よろしくお願いいたします。

142:デフォルトの名無しさん
12/01/04 00:43:19.71
::newとか

143:デフォルトの名無しさん
12/01/04 01:10:59.02
プログラム系の質問とは若干離れてますが、
ここで議論してる事ってかなり高度な事ですよね
プログラマ目指したいのですがここの話に参加できる位にならないと話にならない感じですか?


144:デフォルトの名無しさん
12/01/04 01:27:17.42
>>141
OSのメモリ関連のAPIを直接呼び出してもいいし(WinならVirtualAllocとかHeapAllocとか)
そんなに大きな領域が必要でないならstatic char mempool[10000]とか確保しといてメモリプールとして少しずつ割り当てていくとかある

145:デフォルトの名無しさん
12/01/04 01:27:42.98
>>143
そうかもしれないしそうでないかもしれない精進あるのみ

146:デフォルトの名無しさん
12/01/04 01:34:47.30
>>145
そうですね
学校で無双して気持ち良くなってるレベルじゃダメですねw
精進しないとダメだとわからされました><


147:デフォルトの名無しさん
12/01/04 01:46:22.97
>>141
boost::poolは?

148:デフォルトの名無しさん
12/01/04 01:50:11.58
あ、今docのバグを発見した
boost::poolのリンクが間違ってる

boost/libs/pool/doc/index.html

じゃなくて

boost/libs/pool/doc/html/boost_pool/pool.html



149:デフォルトの名無しさん
12/01/04 01:50:44.55
boost/libs/pool/doc/html/index.html

だった

150:デフォルトの名無しさん
12/01/04 09:36:17.54
>>143
できないと話にならないブラック企業もあるし
ずぶのド素人でも研修でちゃんと使い物にしてくれる優良企業もある

151:デフォルトの名無しさん
12/01/04 11:45:44.45
しかし、3ヶ月でC++が物になるとはちょっと思えんなぁ…
Javaなら3ヶ月でも十分だけど。

152:デフォルトの名無しさん
12/01/04 11:55:40.49
3日で経験3年とかいって放り込むのはよくあることでした

153:デフォルトの名無しさん
12/01/04 12:40:00.82
デストラクタでメモリを解放するとき、まだ参照しているところが残っていたら削除しないようにすねにはどうしたらできますか。
vector<クラス> a(100,クラス(5));
とすると初期化時に呼び出したクラスが解放処理してしまいます。

154:デフォルトの名無しさん
12/01/04 12:45:27.37
つ[コピーコンストラクタ]

155:デフォルトの名無しさん
12/01/04 13:02:12.39
サンクス

156:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 13:30:50.40
難しいよぉ。助けてよ。。。
URLリンク(codepad.org)

157:デフォルトの名無しさん
12/01/04 13:31:16.58
URLリンク(codepad.org)

Deep Copyの問題だよな
代入演算子を書いておけばなおよし

158:デフォルトの名無しさん
12/01/04 13:58:37.74
>>156
名前空間内でoperator newなどを定義するなと言ってくるんだが

..\New_test2.cpp:26:82: error: 'void* mzc::operator new(size_t, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:43:62: error: 'void* mzc::operator new [](size_t, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:47:34: error: 'void mzc::operator delete(void*)' may not be declared within a namespace
..\New_test2.cpp:70:36: error: 'void mzc::operator delete [](void*)' may not be declared within a namespace
..\New_test2.cpp:74:58: error: 'void mzc::operator delete(void*, const mzc_debug_t&)' may not be declared within a namespace
..\New_test2.cpp:91:60: error: 'void mzc::operator delete [](void*, const mzc_debug_t&)' may not be declared within a namespace

規格票は§3.6.2だな

159:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 14:12:04.44
>>156 >>158
URLリンク(codepad.org)
今度はBorland C++で失敗する。

160:デフォルトの名無しさん
12/01/04 14:17:26.14
>>159
..\New_test3.cpp: In function 'void* operator new(size_t, const mzc_debug_t&)':
..\New_test3.cpp:26:37: error: 'malloc' was not declared in this scope
..\New_test3.cpp: In function 'void operator delete(void*)':
..\New_test3.cpp:56:11: error: 'free' was not declared in this scope
..\New_test3.cpp: In function 'void operator delete(void*, const mzc_debug_t&)':
..\New_test3.cpp:66:11: error: 'free' was not declared in this scope
..\New_test3.cpp: In function 'mzc_debug_t MzcNew(const char*, int)':
..\New_test3.cpp:77:26: error: 'strcpy' was not declared in this scope

std:: と <cstdlib> <cstring> を忘れているだけだと思うが

161:デフォルトの名無しさん
12/01/04 14:21:03.91
>>137-140
効率悪くなってんじゃねーか。読みやすくもないし。どこも良くなっるように見えない。

162:デフォルトの名無しさん
12/01/04 14:23:24.64
>>161
だからどれでもいいんだって
find()を使えと言われたから使っただけの話

163:デフォルトの名無しさん
12/01/04 14:27:24.47
stringはメモリ効率悪いよ。
char*なら終端は1バイトだけ。
stringは最低でも長さを表すのに4バイト(32ビット)使っている。
それ以上に無駄がある可能性あり。

164:デフォルトの名無しさん
12/01/04 14:28:52.98
stringに変換するなら、

string s = ch; もしくは string s = (string) ch; 

でいいだろ。

165:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 14:29:41.72
MinGWではOKだが、BCC55ではダメ。原因不明。
URLリンク(codepad.org)

166:デフォルトの名無しさん
12/01/04 14:30:28.96
>>164
お前さあ
>>125を良く読んでないだろ

>案1:
>std::string s = std::string(c);

>これだと、\0 終端していない場合はうまく変換できません。

これを回避したいと言っているんだけど

167:デフォルトの名無しさん
12/01/04 14:30:37.40
stringはサイズの他にcapacityも持ってるんじゃないかなあ?

168:デフォルトの名無しさん
12/01/04 14:33:12.95
>>166
char*を渡されたとき終端は\0で判別するしかないだろう。
それかchar*と一緒にサイズを渡せば解決。

string(ch, size);

169:デフォルトの名無しさん
12/01/04 14:33:50.95
>>165
BCCのバージョンは?
俺のは最新のEmbarcadero6.43で問題なし
ところでバグあるんじゃね?このソース
CodeGuard掛けると何か言ってくるぞ

Error 00003. 0x400000 (r) (Thread 0x1200):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new1.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new1.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new1.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new1.exe:0x01:0016F4) operator_new1.cpp#49
0x00403535(=operator_new1.exe:0x01:002535) operator_new1.cpp#62
0x0040D19F(=operator_new1.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new1.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)

170:デフォルトの名無しさん
12/01/04 14:35:30.76
>>168
だからそれは>>125に既に書いてあるから
ちゃんと読んでから書け

>案2:
>std::string s = std::string(c, 4);

>これでうまく行くと思ったのですが、続けて s += "def"; とすると、
>s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。
>理想では a d e f \0 となってほしいです。

>自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。
>よろしくお願いします。

171:デフォルトの名無しさん
12/01/04 14:35:35.76
>>162
なんだ>>129が書いたんじゃないのか。
お題はfind()を使って効率よく、だよ。

172:デフォルトの名無しさん
12/01/04 14:36:51.77
stringの一時オブジェクト作ってる時点でどうやっても>>129より効率よくなんてならないよ。

173:デフォルトの名無しさん
12/01/04 14:37:00.55
テンプレートでTemplate N、 char[N]のようにサイズとれるか?無理だったか?

174:170
12/01/04 14:37:32.23
アンカー間違えた。
> なんだ>>129が書いたんじゃないのか。
ここ>>130ね。

175:デフォルトの名無しさん
12/01/04 14:39:45.29
>>170
それはゴミも渡しているんだよ。サイズは1だろが。

176:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 14:40:01.43
>>169
どうやらmainの初期化処理と終了処理の内部で::newが使われて
いるのが原因らしい。bool g_initを付けてフラグで指定すると
うまく動くようだ。でもこれって余分なコードだよね?
URLリンク(codepad.org)

177:デフォルトの名無しさん
12/01/04 14:40:32.54
>>173

template <int N>
void func(double (&a)[N]);

みたいな奴か?

178:デフォルトの名無しさん
12/01/04 14:41:27.31
>>175
だからゴミを取り除く議論をしてるだろうが
お前全然人のレス読まないのな

179:デフォルトの名無しさん
12/01/04 14:43:56.89
>>176
いやそれは関係ないと思う
まだエラーが出るぞ

Error 00003. 0x400000 (r) (Thread 0x0E18):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new2.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new2.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new2.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new2.exe:0x01:0016F4) operator_new2.cpp#49
0x00403535(=operator_new2.exe:0x01:002535) operator_new2.cpp#62
0x0040D19F(=operator_new2.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new2.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)

180:デフォルトの名無しさん
12/01/04 14:47:40.15
>>178
ゴミを取り除くためにはstring s = ch;でいいだろ。
charのポインタを渡されたらサイズ不明で処理して\0を終端と見なすしかない。
それを自動でやってくれるのがstring s = ch;

181:デフォルトの名無しさん
12/01/04 14:48:10.94
もういい、しゃべるな。

182:デフォルトの名無しさん
12/01/04 14:49:16.16
>>180 >>125
> 4文字ちょうどの場合は \0 終端されていません。

183:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 14:51:58.17
g_mapのメソッドとnewとdeleteがどこからどういう順番で
呼ばれてくるかが分からない。


184:デフォルトの名無しさん
12/01/04 14:52:38.16
自作関数に限らず、標準関数でも終端は\0として処理するぞ。
4バイト以内に\0が現れなければそれ以降に\0が出るところまでを一文と見なす。
これが正常動作。
最初に\0を付加しないのがバグ。

185:デフォルトの名無しさん
12/01/04 14:55:21.43
いまは固定長でサイズが4だと判明してるから、min( \0が現れる位置、4 )でいいがサイズ不明なら、\0が現れる位置という情報しか取れない。

186:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 14:56:48.54
g_mapのメソッドがコンストラクタよりも前に呼び出される
ということ? どうすればいいんだ。。。

187:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 15:05:47.49
やった!できたー!皆様、有難うございます!
URLリンク(codepad.org)

188:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 15:13:30.05
>>187 このコードを見て皆様はどう思いますか?

189:デフォルトの名無しさん
12/01/04 15:22:46.37
>>184
バグじゃなくて、わざと'\0'終端でない場合どうするかって話をしてるんだが・・・文盲?

190:デフォルトの名無しさん
12/01/04 15:23:17.62
>>185
sizeof()でいいだろ

191:デフォルトの名無しさん
12/01/04 15:28:53.09
>>187
何これ

Error 00001. 0x350010 (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECC0)

| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()

The object array (0x00BAECC0) [size: 1 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)

192:デフォルトの名無しさん
12/01/04 15:29:40.55
Error 00003. 0x350010 (r) (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECE0)

| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()

The object array (0x00BAECE0) [size: 5 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)

Error 00004. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xBA05A0) was never freed

The memory block (0x00BA05A0) [size: 48 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;

193:デフォルトの名無しさん
12/01/04 15:29:51.56
Error 00005. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xB99270) was never freed

The memory block (0x00B99270) [size: 540 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;

194:デフォルトの名無しさん
12/01/04 15:53:35.70

           ______
          r〃〃〃 f7⌒ろ)
           l∥∥∥ ||   f灯
            |∥∥∥ ||   | |
            |儿儿儿._」∟⊥厶
           〔__o____o_≦ト、
.          i / ⌒  ⌒  ヽ )
          !゙ (・ )` ´( ・)   i/
          |  (_人__)    | \
          \  `ー'    /  / ー- 、
.          ,ィ(⊆≧リ≦⊇)〃   /     rク\
.       /   | ̄r少}¨ ̄〃   /    /′ ヽ
      〃 l   |  l| | l| 〃    /     /    └ヽ
     /    l  |l | |l/″   /      !  厂    \
    く,  Y   ! l」fレト!    /       | /        1
    丿  |   | 丿} じ’  /      | /         |
   /     l   | `¨      /      レ′        |

             真の思考停
    (在位 2009年9月16日~2010年6月8日)

   民主朝の初代考停、言行不一致、虚言、脱税、
   そして外交において巨大な負の遺産を築いた。

195:片山博文MZ ◆0lBZNi.Q7evd
12/01/04 15:55:12.76
できた。これで帰れるぞぉ、はあ。
URLリンク(codepad.org)

196:デフォルトの名無しさん
12/01/04 15:57:12.60
>>195
今度こそエラー無しだな
おつかれ

197:デフォルトの名無しさん
12/01/04 17:22:52.87
>>190
関数の引数ではchar[]を渡せずchar*になることが多い。サイズ不明になる。

198:デフォルトの名無しさん
12/01/04 17:41:34.06
>>197
話をそらすなよ
関数の引数の話なら別パラメータでsize_tを渡せばいいし

199:141
12/01/04 21:02:54.35
>>195
感謝です

200:デフォルトの名無しさん
12/01/04 21:49:07.46
class Object {
ObjectManager * pObjMng;
// ry
};

class ObjectManager {
Container<Object *> cpObj;
// ry
};

こんな感じの相互参照があるんだけど
スマポにするならどっちがshared_ptrでどっちがweak_ptrにするのが一般的ですか?

201:デフォルトの名無しさん
12/01/04 22:08:30.42
所有権を持たない場合にweak_ptrを使う

202:デフォルトの名無しさん
12/01/04 22:15:03.46
集約してるならsp
参照しているならwp
ということでしょうか

203:デフォルトの名無しさん
12/01/04 22:34:57.06
戻り値にするようなモノはsp
というか削除する責任者が
居なくなりそうならsp
自分は削除に感知しないと思う
オブジェクトはwpだろ

204:デフォルトの名無しさん
12/01/05 06:45:42.41
STLの安全性は保障されていないということでよろしいでしょうか?

205:デフォルトの名無しさん
12/01/05 08:46:48.44
C系列で保証なんて何も無いよ

206:デフォルトの名無しさん
12/01/05 15:36:00.48
中身の短いメンバ関数って、積極的にヘッダでインライン化するべきですか?
それとも、大した恩恵は無く、ソース内に入れておくべきですか?


207:デフォルトの名無しさん
12/01/05 15:41:12.11
>>206
呼び出す回数に凄く依存する。
インライン化されずに時間掛かったとして、全体0.01%だったらしなくても変わらず。
出来上がってから実測。

208:デフォルトの名無しさん
12/01/05 15:42:46.14
>>206
自分はコンパイラさんにお任せするのでinlineキーワードを使ったことがない。

209:デフォルトの名無しさん
12/01/05 15:52:54.35
クラス定義内に書いたらinline付いてるのと同じ。

どんなに短くても、ループ内で何回呼び出されようと
自動的にインライン化されることはほとんどないので
自分でインラインにするべきかどうか判断した方がいい。

短ければ関数呼び出しよりもサイズ小さくなる場合もあるし。

210:208
12/01/05 15:57:58.20
>>209
あれ?そうなの??
昔最適化で勝手にインラインになるから気にするなって言われたのをずーっと信じてたんだけど。
まー、個人的にはカリカリチューンはきらいだからねぇ。。。
むむむ・・・。

211:デフォルトの名無しさん
12/01/05 16:14:54.06
ボトルネックが確定してから変更すれば良い。
それまでは自分の書きやすい方法で。

212:208
12/01/05 16:17:14.64
おk!

213:デフォルトの名無しさん
12/01/05 16:49:01.18
昔はコンパイル単位をまたがる最適化とか一般的じゃなかったけど
GCCは4.5からVCは8から出来たと思う
だから今は関数に別名を付けたいときやヘッダで完結させたいときしかinline使わないな

214:デフォルトの名無しさん
12/01/05 16:52:25.27
インライン使うと、同じ関数が他所に分断され配置されキャッシュの効果が薄まる。
なるべく使わない方がメモリと速度に良い。

215:デフォルトの名無しさん
12/01/05 16:58:37.20
AMDがVC++ならO2よりO1使ってキャッシュに詰め込めと言ったり大変な世界だな

216:デフォルトの名無しさん
12/01/05 17:07:24.77
プライベートメンバのラッパとか
関数呼び出しよりも軽い処理は積極的に
インラインにすればいいんじゃねーの

217:デフォルトの名無しさん
12/01/05 17:12:01.61
Javaとc++どっちやろうか迷ってます。
プログラミングは初めてです。
両方やったことある人に聞きます。
最初はどっちから手を出した方がいいですか?

218:デフォルトの名無しさん
12/01/05 17:14:25.52
>>217
初見でC++は死ぬと思うがな
割と適当でもなんとかなるJavaにしたら?
まぁホント言うならC#(ry

219:デフォルトの名無しさん
12/01/05 17:18:43.63
C++はマルチパラダイムかつ値のセマンティクスがある言語だから、初心者がやると(プログラムが)爆死しやすい。
オブジェクト指向一本に絞ってるJavaのが無難。
メモリ上の扱いとか覚える気ならC++。

220:デフォルトの名無しさん
12/01/05 17:20:22.01
>>217
マルチPOSTすんなカス

221:デフォルトの名無しさん
12/01/05 17:31:58.83
実用面で、PHP(C++のスクリプト言語化のようなもの)
Groovy(JAVAのスクリプト言語化のようなもの)
C#
をすすめてみた。

222:デフォルトの名無しさん
12/01/05 17:37:58.84
Groovyってどんな言語? JavaプログラマのためのGroovy入門(2/7):CodeZine
URLリンク(codezine.jp)

223:デフォルトの名無しさん
12/01/05 17:42:28.04
>>213
ヘッダだけで完結させるならstaticじゃね
どちらでも内部結合になるし、
そんな場合は大して長くない処理を書くことが多いからinlineでも
全然問題ないと思うけど

224:デフォルトの名無しさん
12/01/05 17:45:02.44
C++からやれよ。AOJとかの結果見ると、Javaがどんだけメモリバカ食いで実行速度遅いか、がく然とするぞ。

225:デフォルトの名無しさん
12/01/05 17:48:40.31
>>223
下駄雪駄もstaticで書くのか?w

226:デフォルトの名無しさん
12/01/05 17:49:15.64
>>223
下駄雪駄もstaticで書くのか?w

227:デフォルトの名無しさん
12/01/05 17:53:10.30
>>225
普通の関数の話だった
セッターゲッターはstaticの意味が変わってしまうがな
てか下駄雪駄の意味がわからずしばらく考えたじゃないか

228:デフォルトの名無しさん
12/01/05 18:56:59.60
内部結合のstaticはC++11で廃止されたから使わない

229:206
12/01/05 19:03:11.22
みなさんどうもです。
セッタやゲッタの中にも数行必要なものもありますし、
そうなるとますますソースとヘッダどちらに書くかの境界線が判断できない上に、
「このセッタはヘッダ」「このセッタはソース」みたいになると、
個人的には読みにくいと感じるため、>>211さんの言われるように、
ボトルネックだと感じるまではすべてソースに書いておこうと思います。

230:デフォルトの名無しさん
12/01/05 20:34:46.07
>>218
べつにC++からでいいだろ。
Java勉強しなくても、C++知ってりゃ書ける。
その逆はない。

231:デフォルトの名無しさん
12/01/05 20:38:36.01
オブジェクト指向言語からやるとC++の変なところを学習しにくい
C++を便利に使ってしまう

232:デフォルトの名無しさん
12/01/05 20:44:00.84
>>214
それはない。インライン展開しまくったとしても、
今時のキャッシュメモリなら1次キャッシュに収まるからな。
それと、96bit画像の描画したときは、インライン展開した方が、
関数外と関数内の式が結合され7割まし早かった。

233:デフォルトの名無しさん
12/01/05 20:51:23.46
OO勉強したいなら、PythonやSmalltalkから入ったほうがマシだろ。
参考書の大半が引数書き換えを邪気に扱ってるし、
オブジェクトの委譲によって、オブジェクトを組み立て、
オブジェクトの振る舞いを作ることによりプログラムの動作を
決めるというOOの基本を実践してるサンプルが少ない。

SwingでGUIをつくるのにJFrameを継承するとかバカな解説ばっか。

234:デフォルトの名無しさん
12/01/05 21:12:28.04
実はオブジェクト指向ってしっくりこないんです!

235:デフォルトの名無しさん
12/01/05 21:13:37.27
そうですか。それはスパゲティですね。

236:デフォルトの名無しさん
12/01/05 21:33:57.78
私はIS部門の人間なんです。SIerの客なんですよ。私に嫌われたらどうなりますか?
皆さん生きていけないですよ!

237:デフォルトの名無しさん
12/01/05 21:38:35.52
優柔不断なのが悪い
他の女とどうなるか解からんが
素直にシャルルを選んどけ

238:デフォルトの名無しさん
12/01/05 21:39:08.77
>>236
>私に嫌われたらどうなりますか?

おまえの仕事をする奴がいなくなるだけじゃない?

239:デフォルトの名無しさん
12/01/05 21:42:45.09
みながわさんはいまだにオブジェクト指向の話で持ち出されるのか

240:デフォルトの名無しさん
12/01/06 02:02:23.80
>>223
inline に内部結合にするなんて効果は無いよ。

241:デフォルトの名無しさん
12/01/06 02:07:20.94
すみません、C++初心者です
例えば、Objクラス型のオブジェクトを、引数なしで作成・初期かする場合、

Obj obj;

とするだけで、デフォルトコンストラクタがよばれるのでしたっけ?

それとも、

Obj obj();


でないといけないのでしょうか。

242:デフォルトの名無しさん
12/01/06 02:08:53.29
>>241
なんで試さないんだよ

ちなみに前者が正解。後者はアウト。

243:241
12/01/06 02:12:05.64
>>242
すみません。。
どうもありがとうございます。

デフォルトコンストラクタに、適当なpublicメンバ変数aに定数を代入する
操作が入ったHogeクラスを作って、

Hoge obj;


のあと、obj.aの内容をみて確かめてみます。

244:デフォルトの名無しさん
12/01/06 07:22:00.98
>>228
見たけど別に廃止されてなかったが (3.5-3)

245:デフォルトの名無しさん
12/01/06 10:15:13.53
>>244 deprecatedじゃね

246:デフォルトの名無しさん
12/01/06 10:30:20.35
C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?

247:デフォルトの名無しさん
12/01/06 11:02:49.28
>ある程度アクセス制御されたグローバル変数
具体例頼む。

248:デフォルトの名無しさん
12/01/06 11:33:20.05
class shared {
protected:
static int n;
};

class hoge : public shared {};
class fuga : public shared {};

みたいに丸出しよりましかな程度のものだけど

249:デフォルトの名無しさん
12/01/06 11:36:26.76
関係ないけどこれの方がnをcppで定義しなくていいから楽。

class shared{
protected:
static int &n(){ static int value; return value; }
};

250:デフォルトの名無しさん
12/01/06 11:37:03.63
>C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
どっちでもいいんじゃない?マルチパラダイムなんだし。

251:デフォルトの名無しさん
12/01/06 11:56:25.41
>>246 「いい」の基準が不明だな。どっちにも文句を付けられるだろう。

252:デフォルトの名無しさん
12/01/06 13:25:32.88
>>248
どっちも無し。

int n;
new hoge( &n );
new fuga( &n );
で十分

253:デフォルトの名無しさん
12/01/06 13:41:32.84
template<typename T>
struct temp_type{ typedef const T &t; };

template<typename T>
struct temp_type<T*>{ typedef T *t; };

template<>
struct temp_type<int>{ typedef int t; };

template<typename T>
void hoge(typename temp_type<T>::t v){}

int a = 1;
int *b = &a;
struct HOGE{} h = {};
//C2783
hoge(a);
hoge(b);
hoge(h);

テンプレートで指定された型に応じて
値を渡すか、const参照を渡すかを決めたいのですが
「テンプレート 引数を 'T' に対して減少できませんでした」
となります。

関数hogeでは引数を書き換える予定はないです。
テンプレートでない関数の場合は
例えばconst int &やint *const &など渡さないと思うし
参照を関数内でデリファレンスするのも無駄だと思うので
アドレスとおなじサイズの整数やポインタを渡す場合は
値渡し選択したいのですが、どのように書いたらいいですか?

254:デフォルトの名無しさん
12/01/06 13:47:54.36
hoge<int>( 10 ); // おそらくOK



255:デフォルトの名無しさん
12/01/06 13:51:12.06
>>253
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
template<typename T> void hoge(int v);
これでは何故ダメなのか?

256:デフォルトの名無しさん
12/01/06 14:25:35.67
URLリンク(ideone.com)

257:デフォルトの名無しさん
12/01/06 14:29:15.48
複数のクラスが互いに参照しあって連携してるケースは難しいね
メディエーターパターンを使ってシステムの連絡路を一本化するのがいいと言われてやってみたけど
メディエーターのインターフェースが凄まじく大きくなってしまった

258:デフォルトの名無しさん
12/01/06 14:30:20.02
それはどういう意味があるコードなの?
オーバーロードとは何が違うの?

259:デフォルトの名無しさん
12/01/06 14:31:41.96
>>254 型を書けばいけました。でも呼び出し側の書き方は変えたくないです。
>>255 hogeの処理は共通なので定義は1つにしたいです。

hogeのような関数がたくさんあって、呼び出しも多いので
関数を型の個数分書いたり、呼び出し部分の記述量を増やすことなく
実現するにはどのようにしたらよいですか?

条件後出しですいません。

260:デフォルトの名無しさん
12/01/06 14:38:49.00
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
処理の内容が同じならこの2つでいいよ。
後者は、前者を呼び出すだけでいい。

速度はコンパイラが勝手に最適化するから気にすんな。
うんな事より、プログラムを1つ完成させることに力を入れろ。
どうしても気になるなら最適化後のアセンブリコード見て確認してみ。

261:デフォルトの名無しさん
12/01/06 14:41:42.27
>>257
Mediatorを分割すりゃよかったんじゃね。
別に1つの依頼者クラスが1種類の調停者にだけ
依頼せにゃならんわけでもないだろう。

そもそも何をしてるのか知らんから
Mediatorが適した課題かどうか怪しいが

262:デフォルトの名無しさん
12/01/06 20:41:49.47

bool Load()
{
return false;
}


void Load()
{
new throw Exception()
}

関数のエラーをboolかthrowどっちで検知すればいいのだろうか


263:デフォルトの名無しさん
12/01/06 20:44:12.88


264:デフォルトの名無しさん
12/01/06 20:48:23.09
正解: optional

265:デフォルトの名無しさん
12/01/06 20:55:09.37
>>241

C++11からは、一様な初期化構文を使って、デフォルトコンストラクタ呼び出しを明示できるよ
URLリンク(d.hatena.ne.jp)

X x; // ok

X x(); // error

X x{}; // ok (C++11)


266:デフォルトの名無しさん
12/01/06 20:57:37.01
X x {} って気色悪いな

267:デフォルトの名無しさん
12/01/06 20:58:50.74
C#ではよくある事。

268:デフォルトの名無しさん
12/01/06 21:17:49.32
class IHoge {
public:
virtual ~IHoge(void) { }
virtual void Method(void) = 0;
};

class HogeBase : public IHoge {
public:
void Method(void) { }
};

class HogeEx : public HogeBase { };

こうやっていちいち分けるのが流行ってるのはなんで?
どうせポリモーフィックなクラスはほぼ全てがHogeBaseを継承するんだし

class HogeBase {
public:
virtual ~HogeBase(void) { }
virtual void Method(void) { }
};

class HogeEx : public HogeBase { };

でいいじゃないですか?

269:デフォルトの名無しさん
12/01/06 21:30:19.69
>>268
IHogeって事はCOMか?COMは実体を持てないからな。

それは別として、最上位に完全抽象化クラスを置いとくのは、
HogeBaseの全てをオーバーライドするクラスを作ったとき、
HogeBaseの実装がデッドウエイト(容量食うだけのゴミ)になるから。


270:デフォルトの名無しさん
12/01/06 21:32:37.36
>>262
Function( source.Load() ); // Loadはsourceから読み出した情報を返す
こういうコードを書こうとしたとき、どっちを取るべきが正しいか考えろ。

271:デフォルトの名無しさん
12/01/06 21:39:14.50
>>269
なるほど

272:デフォルトの名無しさん
12/01/06 21:48:34.28
>>262
Loadが失敗する状況がふつうにありえそうなら1。
(プログラムの実行自体が怪しくなるような)ハードやOSの異常による状況でしか失敗しないようなら2。

273:デフォルトの名無しさん
12/01/06 21:51:30.44
bool Load(...) {
// ファイルフォーマットエラーなど
return false;
// ハードウェアエラーなど
throw unko();
// 成功
return true;
}

これで決まりや

274:デフォルトの名無しさん
12/01/06 22:01:26.36


 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける


275:デフォルトの名無しさん
12/01/06 22:03:02.69
例外とはまさしく例外であり必ずキャッチされなければプログラムを終了するしかないものに対して使うのがいいだろう。
一方、返却値は返却値。失敗してもいかなるリソースの破壊、開放忘れも発生しない場合に使える。

276:デフォルトの名無しさん
12/01/06 22:05:46.18
事前に書いたフローチャートに書いてないことは例外

277:デフォルトの名無しさん
12/01/06 22:07:59.24
例外ってフローチャートに書いてないの?

278:デフォルトの名無しさん
12/01/06 22:13:05.48
普通は書かない
書いてあるならどんなエラーでも想定の範囲内だから例外ではなく返り値などで判断

279:デフォルトの名無しさん
12/01/06 23:42:39.91
二重キャストって意味あるんだね
はまって痛い目見たよ
こんなん

template<class T> struct Base {
  Base(){ unko = reinterpret_cast<__int64>(this); }
  void OK(){ T *t = static_cast<T *>(reinterpret_cast<Base<T> *>(unko); }
  void NG(){ T *t = reinterpret_cast<T *>(unko); }
  __int64 unko;
};

struct Derived : Base<Derived> {};

int main()
{
  Derived d;
}

280:デフォルトの名無しさん
12/01/07 00:19:45.06
void NG(){ T *t = reinterpret_cast<Base<T> *>(unko); } これだけで十分そうだが?
reinterpret_castで直接reinterpret_cast<T*>してんのが引っかかっただけじゃないの?
void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
オフセットが違うから位置がずれて異常が起きる。

281:デフォルトの名無しさん
12/01/07 00:54:17.62
>>280
>void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
>オフセットが違うから位置がずれて異常が起きる。
ありがとう、目から鱗だわ
ポインタ値とアドレス値は同じものだと思ってたけど違うのか


282:デフォルトの名無しさん
12/01/07 01:39:13.10
>>245
廃止ってのはexportみたいなのを言うんだ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch