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


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

C++相談室 part95



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

前スレ
C++相談室 part94
toro.2ch.net/test/read.cgi/tech/1329512856/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1331894668/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

72 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 09:59:09.71 ]
自前クラスはポインタ使わず全部参照でやっていますが、
メソッド関数を呼び出すコードを見て、
「この変数は値を渡しているだけなのか、書き換えられて返ってくるのかどうか」がぱっと見分かりません。
(引数がconstかどうか調べれば判断つきますが、面倒で付けずに済ますこともあるし、呼び出し側のソースを流し読みしてるときに分かりずらい)

書き換えないなら必ずconst、呼び出し側のソース見てるときは、メソッドにマウスカーソル合わせて引数をチェック、
というやり方しかないのでしょうか?

73 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 10:07:28.94 ]
>>72
そういうことにならないように関数名や引数並び、引数に使う変数名をちゃんとつける。
どうやったところで関数宣言を見ないのなら正確に把握というわけにはいかない。

74 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 11:18:37.08 ]
>>72
それを嫌って、書き換える場合はポインタ、書き換えない場合はconst参照、と使い分ける人もいる。
私の場合、関数名にgetなどが含まれていて戻り値のない関数は、一番目の引き数が書き換え対象だ。

75 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 11:57:23.49 ]
bool hoge(){
bool result = false;
/* いろいろ処理*/

// 戻り値の用意
return (ioResult&&sockResult&&time<10);
}

なんて関数をコーディングした場合、
if(hoge())
ではなく、戻り値必要ないので
hoge();
なんて書いた場合は、コンパイラの最適化でvoid版hoge()を作って、returnの行を出力しない、
みたいなことはしてくれるんでしょうか?
普通にbool版hoge()が呼ばれて、普通に関数内全部実行して、戻り値はテンポラリかなにかに入れてすぐ捨てるんでしょうか?

76 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:02:41.77 ]
>>75
return の式に非ローカルな副作用が一切無いのであれば、そういう最適化は可能ではある。
ただしあまり大きな違いにはならなさそうなので、実際に最適化されることは少なくとも現時点では
あまりないだろうと思うし、気にするべきでもないと思う。

77 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:04:56.89 ]
最適化されたコードのレジスタ確認してください

78 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:27:30.80 ]
>>75
そのhoge()が同一翻訳単位内から呼ばれた場合は、インライン展開される場合がある。
そのとき、そのreturn文には副作用がないので省略される可能性は高い。
# 一部のコンパイラでは、同一翻訳単位外からでも最適化されうる。
とは言え、void版のhoge()が用意されるわけではない。

79 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:34:37.23 ]
>>75は無理だろ。
hogeがstatic関数とかでコンパイル単位内ローカルなら可能かも知れんが
やってるコンパイラは無いだろう。

80 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 13:01:08.60 ]
ああそうかインラインなら最適化できるね



81 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 13:41:32.29 ]
staticじゃなくてもVC++のLTCGとかならやってくれるんじゃね

82 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 13:57:55.02 ]
>>81
確かにそうかも。試してないけど。
最適化技術って進んでるんだね。

83 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 22:33:31.08 ]
Microsoft (R) C/C++ Optimizing Compiler ならDLLに入ってても
インライン展開してくれるし、親クラスにキャストしてるオブジェクトの
仮想関数ですらインライン展開してくれるからな。

84 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:14:48.25 ]
オブジェクトファイルかなんかと勘違いしてんじゃないか

85 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:23:53.10 ]
勘違いってなんの事を言っている?

インライン関数のインポートとエクスポート
msdn.microsoft.com/ja-jp/library/feffc7b5(v=vs.80).aspx

86 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:52:13.14 ]
それはインライン関数をDLLに入れられるって話で
DLL内の関数をインライン展開できるって話じゃないだろ

87 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:58:02.23 ]
意味が解らないの?

注意
インポート インライン関数は、DLL のバージョン間で矛盾することがあるので、
インライン関数のインポート時は注意が必要です。インライン関数は、アプリケーション コード内に展開されます。
このため、関数を書き直した場合は、アプリケーション自体をコンパイルし直さないと、
インライン関数は更新されません。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。


88 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:20:06.29 ]
それのどこがDLLの関数をEXE側でインライン展開できると読めるんだ?

89 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:23:33.94 ]
namespaceの別名って、undefみたいに消せないのか?
どうせアセンブリコードに展開したときは、本来の名前空間の
名前になるんだから、不要になったら削除できてもいいだろうに

90 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:26:30.84 ]
>>88
インライン展開しないなら、こんな事わざわざ書く必要ないだろ。
逆に「DLLにインライン関数定義してもインライン展開できません」と書くのが筋だろ。

>インポート インライン関数は、DLL のバージョン間で矛盾することがあるので
>。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。



91 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:38:58.63 ]
インライン関数を定義したヘッダとDLLが矛盾するケースがあるって話なんだが、それ
そもそも、リンク時に使うのはインポートライブラリであってDLLそのものは一切使わない


92 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:44:47.35 ]
ヘッダーじゃねぇよ。cppに定義して、__dclspec(export) inline 〜と書いた関数でも取り込まれる。
DLLを参照してるアプリケーションをコンパイルするとき、DLLが参照できればぶっこ抜かれるんだよ。


93 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 03:34:47.68 ]
韓国で貯蓄銀行4行また営業停止
仰天!会長は元偽ソウル大生、中国密航で逮捕
jbpress.ismedia.jp/articles/-/35163



自己資本比率5.6%、実はマイナス16.2%だった

営業処分の直前に漁船で密航を試みた会長の正体

金会長は、未来貯蓄銀行に対する営業停止処分が不可避と見て、かねて準備していた密航ルートを使って中国に逃亡しようとした。
金融委員会は未来貯蓄銀行など4つの貯蓄銀行を営業停止処分とした。
来貯蓄銀行の場合、粉飾決算を重ね、「5.67%」と発表していたBIS基準に基づく自己資本比率が実際はマイナス16.2%であることが明らかになった。
jbpress.ismedia.jp/articles/-/35163

◆貯蓄銀行とは庶民専用の銀行

貯蓄銀行(ちょちくぎんこう)とは、個人の貯蓄を引き受けることを主目的とする金融機関である。
庶民に対して倹約を奨励し貯蓄により生活を安定させるための公益的な金融機関。
ja.wikipedia.org/wiki/%E8%B2%AF%E8%93%84%E9%8A%80%E8%A1%8C

94 名前:デフォルトの名無しさん [2012/05/11(金) 05:33:41.33 ]
struct X {
const int x;
X(istream& is) try: x(read_int(is)) {
catch (何か) ...
}
const int read_int(istream& is) const {
int x;
is>>x;
if (x<0) throw 何か;
return x; }
};

int main()
{
X a(cin);//負の数が与えられるまで読み続ける
}

みたいなことってできませんか?

95 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 06:21:28.72 ]
X(istream& is) {
int x;
for (;;) {
is >> x;
if (!cin) {
cin.clear();
cin.ignore( 1024, '\n' );
continue;
}
if (x < 0);
return ;
}
};

96 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 06:30:32.40 ]
>>94
何がしたいの?

97 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 06:50:37.13 ]
>>94
のポイントは、
- constメンバを初期化子を使って初期化していること
- tryブロックをそこにかまして、例外処理にしていること
です。
無論、95みたく普通にやればいいのだが。

98 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:11:41.62 ]
>>95
はread_intね。いけてる気がする。

99 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:19:17.27 ]
try {
cin >> x;
} catch (...) {
入力を求める
}
みたいなことを初期化子についてやりたかった。

100 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:33:31.87 ]
int read_int(istream& is) {
try {
int x;
cin >> x;
return x;
}
catch (...) {
return read_int(is);
}
}
みたいな雰囲気。
例外の使い方がよくわからないし、istreamは例外投げないのかな・・・
ひっかかってくれない。



101 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:39:30.34 ]
try {
int x=-1;
cin >> x;
if (x<0) throw x;
return x;
}
catch (int input) {
cerr << input << endl;
read_int(is);
}
でイケた。かっこよくね?

102 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:42:50.74 ]
初心者だからアホーなことしてたら指摘してほしいです。
こんなので大丈夫なのかしら・・・。

103 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:44:39.57 ]
status = !status;

これが右に偏ってる気がして気持ち悪いんだけど
どうにかならない?

104 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:19:53.45 ]
うん

105 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:30:41.25 ]
intだと上のでいいのですが、
double x; cin >> x;
の結果がよく分かりません。

stdinに数値でない"abc"を入れたときxは0にセットされるようなのですが、
doubleなのでx==0で判定するのも気持ち悪い。
cinが例外飛ばしてくれたりしますか?

106 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:36:01.98 ]
飛ばさねーよ

107 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:43:35.84 ]
やっぱif(cin>>x)で判定して、自分で例外飛ばせばいいか。

108 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:51:53.96 ]
ところで95で
cin.ignore(1024,'\n');
としてる箇所ですが、INT_MAXとかを引数にしてもいいんですかね?
決め打ちを避けたいだけなんだけど。

109 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:56:45.82 ]
>>105
std::cin.exceptions(std::ios::failbit | std::ios::badbit) ってやれば例外飛ぶよ。
cin に設定しちゃうと思わぬところで飛んで困るかもしれないけど。

110 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 09:03:59.04 ]
>>109
へぇ、そんなのがあるんですね。
JavaだとデフォルトでIOException飛ばすから、コンパイル通すまで面倒だったりしますが。

>>108
numeric_limits<streamsize>::max()
を第一引数に渡すのはやりすぎでしょうか?



111 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 09:20:10.07 ]
>>107
C++設計者の例。
www2.research.att.com/~bs/bs_faq2.html
の↓あたり。
while(cin>>d) v.push_back(d); // read elements
if (!cin.eof()) { // check if input failed
cerr << "format error¥n";
return 1; // error return
}


112 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 11:08:35.52 ]
音声ファイルのパスSoundPathを受け取り、StartSampleからEndSampleまでの標本の値を調べ、
その区間の音量を返す関数を作ったのですが、現状ではwavファイルにしか使用できません。
mp3とoggにも使用できるようにしたいのですが、どのようにすれば可能ですか?

int CBgm::VolumeMean(int StartSample,int EndSample,char SoundPath[]){
FILE* fp;
errno_t err;
short int LVol=0,RVol=0;
int Ave=0;
LONGLONG Sum=0;
if((err=fopen_s(&fp,SoundPath,"rb"))!=0){
return 0;
}
fseek(fp,44+StartSample*4,SEEK_SET);
for(int i=0;i<EndSample-StartSample;i++){
fread(&LVol,sizeof(LVol),1,fp);
fread(&RVol,sizeof(RVol),1,fp);
Sum+=MAX(abs(LVol),abs(RVol));
}
if(EndSample-StartSample>0){
Ave=(int)(Sum/(EndSample-StartSample));
}
fclose(fp);
return Ave;
}

113 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 11:34:52.67 ]
前もってユーザが自分でwavに変換するようマニュアルに書いておく

114 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:48:55.12 ]
ま、ファイルから直接〜じゃなくて、一旦展開してから同じように調べるとかでいいんじゃね?

115 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:49:55.94 ]
適当なフリーの変換ツールでも呼べばいいんじゃね?

116 名前:デフォルトの名無しさん [2012/05/13(日) 09:05:43.48 ]
class X {
int a,b;
inline int f() { return a+b; }
int g() { return a+b; }
int h();
inline friend int plus(X& x) { return x.a+x.b; }
};
inline int X::h() { return a+b; }

hの定義につけたインライン要請は意味があると思うのですが、
クラス内で定義しているfにつけたところで、何もつけないgとまったく同等なのでしょうか?
あと同様にクラス内に書いたfriendについてもお願いします。

117 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 09:11:11.31 ]
inline int X::h()これ以外全部意味がない

118 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 10:13:52.49 ]
クラス定義内でメンバ関数・friend関数の定義を書いた場合、暗黙的にinlineがついてるものとみなされる

119 名前:デフォルトの名無しさん [2012/05/13(日) 13:42:41.18 ]
Cのライブラリ(たとえばcstdlib)を使う場合に、
グローバルな名前空間を汚染させない方法ってありますか?
namespace X {
#include <cstdlib>
}
はコンパイルエラーになってしまうのですが・・・

120 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:14:33.20 ]
>>119 無い。



121 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:18:36.79 ]
どうせstdlib.hからcstdlibとか名前かえるくらいなら、
namespaceに入れてくれたらいいのに・・・
あるいはstatic includeみたいなのでも。

122 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:19:52.84 ]
cstdlibを使うのなら汚染させないのは無理だと思うけどstd名前空間にも再宣言されているからstdで使う

123 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:29:45.35 ]
>>119
関数に限れば、汚染を特定のコンパイル単位内に限定する方法なら有る
特定のコンパイル単位においてのみCのヘッダをインクルードし、
そこで適当なnamespaceを設定して同名のwrapperでも書き、他所のコンパイル単位からは
同名のwrapperの方を呼べば良い
(※ printf()のような可変長関数の場合はwrapperからvprintf系を呼ぶ

C++の関数シンボルは引数型とセットでマングルされるので、
仮にwrapper外(C++世界)のグローバル名前空間でCのライブラリに含まれるのと同名の関数を定義しても
(extern "C" double ceil(double)等して明示的にCリンケージにしない限り)問題にならない


124 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:32:35.45 ]
>>121
C++03 まではそのつもりで規格もそうなっていたけど、コンパイラベンダの反発(無視)が
何年も続いたため、 C++11 で規格のほうが現状を追認するようになってしまっている。
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456

125 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:43:32.30 ]
>>122
なんという無意味な再宣言w
コーディング規約として、そうするか・・・

>>123
負担が線形増大w
けど参考になります。

>>124
ふむふむ、将来的にも予定はない・・・と。

126 名前:122 mailto:sage [2012/05/13(日) 14:51:25.13 ]
>>125
こーやればいけたので報告
やっていいかどうかはわからないので詳しい人お願いします

#include <iostream>
namespace hoge {
#include <cstdlib>
  using::atoi;
}
int main(void)
{
  int a = hoge::atoi("4");
  std::cout << a << std::endl;
  return 0;
}

127 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:53:10.74 ]
結局リンクの段階でどうしても汚染されるので
無駄だよ

128 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:54:22.82 ]
汚染を防ぐじゃなくてstdじゃない名前空間で使うことね

129 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:03:15.52 ]
それだけなら別にこれでいいじゃん

#include <cstdlib>
namespace hoge { using ::atoi; }

130 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:07:17.90 ]
>>126
当然アウト。
17.6.2.2 [using.headers] p3
> A translation unit shall include a header only outside of any external declaration or definition, ...



131 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:16:09.34 ]
>>126
GCC4.7でコンパイル通らないよ。

132 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:30:36.18 ]
>>129
あーそうだね、ごめんなさい
>>126は忘れてください

>>130
解説あり

133 名前:デフォルトの名無しさん [2012/05/13(日) 16:00:48.99 ]
PODなら16byteの構造体に
多重継承でオペレータ関数を追加したら、28byteになってしまった。
多重継承にしたのは、他のクラスでも使うからで
アップキャスト等する予定はありません。
これを多重継承ではなくコピペにしたら16byteのままのはずです。
ただ、コピペするとクラスのコードが長くなって、望ましくありません。
サイズを増やさずに、継承のように再利用出来る方法はありませんか?

134 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 16:31:46.26 ]
>>133 C++でおk

135 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 17:08:52.40 ]
>>134 はげどう
>>133 C++でおk
多重継承で基底クラスと派生クラスのサイズが同じになるのが普通ジャネ、
みたいな質問をされると困惑するから具体例示せ


136 名前:860 [2012/05/13(日) 18:03:56.68 ]
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : public A, public B { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

137 名前:133 [2012/05/13(日) 18:06:33.52 ]
※↑は間違いです。失礼
---
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

138 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:22:49.23 ]
>>137
codepad.org/Q4fuvcOb
> size of C is 1
> size of D is 1
> size of E is 1

VC++2010EE の最適化が至らないといだけのことだな。

139 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:28:21.41 ]
www.google.co.jp/search?q=msvc+multiple+inheritance+empty+base+class

stackoverflow.com/questions/6119927/empty-base-optimisation-msvc

https://connect.microsoft.com/VisualStudio/feedback/details/100686/empty-member-optimization-not-working-properly
> 終了
> 解決策: 修正しない
...
> 投稿者: Microsoft、投稿日時: 2006/04/11 11:50
> Hi: unfortunately even though this is a bug in the Visual C++ object
> model we are unable to fix it at this time given that fixing it would
> potentially break a lot of existing programs as the sizes of objects
> would change. Hopefully in the future we may be able to address this
> issue but not for the next release of the product.

140 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:32:38.27 ]
俺もその結論に達しました。
クラスは空であってもサイズは1。
ただし継承元が空の場合、最適化で0とすることが出来る。
しかし、VC++2010EEの場合、継承元が2つ以下の場合しか最適化が効かないようです。
残念、こういう結果になるとは。ともかくありがとうございました。



141 名前:デフォルトの名無しさん [2012/05/13(日) 19:18:04.32 ]
int main(int argc, char* argv[]) {
vector<string> arg(argv,argv+argc);//ここまでOKだよね?
int res;
while ((res=getopt(arg.size(),&arg[0],"a"))!=-1) {
}
}
が通らない。
char* const*にconvertできないといって怒られる。
&arg[0]をc_strを指すポインタに変換しないといけない(?)ですが、
static_castで何とかなりますか?

142 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:20:05.07 ]
ちなみに適当で
static_cast<char*>(&arg[0])
とやってもダメ。

143 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:34:20.71 ]
>>141
何がしたいの? getopt(argc, argv, "a") してから arg 作っちゃダメなの?

144 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:37:58.28 ]
>>126
#include<c〜>でインクルードして
グローバル名前空間に関数が展開されるのは規格違反
MSのクソコンパイラー以外じゃコンパイル出来んぞ

145 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:38:05.27 ]
>>143
stringとvectorでラッパを作ろうと思って。

146 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:43:57.51 ]
わざとヤッてるとしか見えんな

147 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:46:05.79 ]
>>144
>>132

148 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:51:06.88 ]
static_castはダメだけど、
reinterpret_cast<char**>(&arg[0])でイケた。
違いがわからんw

149 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:10:31.93 ]
>>140
VC++2010EEつうか、Windows SDKにも入ってる
MSのMicrosoft (R) C/C++ Optimizing Compilerの問題じゃね。
EEだろうがどのエディションでもコンパイラーは同じだから問題も同じ。

150 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:10:51.44 ]
>>148 コンパイルは通るかもしれんが、イケてないよ。



151 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:11:34.63 ]
>>145 >>143

152 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:15:55.15 ]
>>148
int main( int argc, char *argv[] )
{
 //std::vector<std::string> arg(argv,argv+argc); この時点でダメ
 int res;
 while( ( res = getopt(argc, argv, "a") ) != -1 )
 {
 }
}

getoptはchar**型を取るのであって、std::vector<std::string>を取れるように出来ていない
例え std::string args[argc];で有ってもアウト。std::stringとcharの配列には互換性が無い。


153 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:18:37.42 ]
>>152
arg の初期化自体には別に問題ないだろ。 char* → std::string の変換がきく。

154 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:22:13.96 ]
>>153
そういう問題じゃないだろ。
std::vector<std::string>をgetoptに突っ込めばいいと考えてる時点でダメなんだろ。

155 名前:133 mailto:sage [2012/05/13(日) 21:44:24.51 ]
>>137
12クラスの多重継承を行った、とでも言うのでない限り、>137が>133(12バイトも増えた)の原因とは考えにくい
元クラスA,Bおよび派生クラスCそれぞれで仮想関数を使ってねえが
そう考えると、2クラスの多重継承で12 バイト増える説明がつく。
それぞれのクラスが仮想関数テーブルへのポインタを含むから、4*3で12バイト増。
(これは>138のサンプルでf(), g()にvirtualを付けると検証できる。

また、強いて言えば>137のサンプル(仮想関数抜き)で
どうして>133の多重継承理由(他のクラスでも使うから)になるのかわからん

別にMSを擁護するわけではないが、interfaceの多重継承みたいなことをしたいのだとすれば
基底クラスは必ずポインタ1個分(今日日のPCなら4バイト)の領域を占めるから、>140のような最適化の出番はない、
ハズ

156 名前:135 mailto:sage [2012/05/13(日) 21:47:48.55 ]
155 = 135。しつれい



157 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:49:56.32 ]
PODという用語を理解してるなら
仮想関数使うとサイズが増えるのくらい知ってそうな気もするけど
そうでない事もあるから困る

158 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:53:23.93 ]
>>155
typedef やら static なメンバ関数やら、仮想関数以外にも継承したくなるものはあるだろ。

159 名前:155 mailto:sage [2012/05/13(日) 22:04:04.04 ]
いやすまん、揉める前>155の「2クラス多重継承で12バイト増える」を訂正
>137のサンプルにおいて、
struct D : public A, public B { char a; virtual void f() { } };
としたとき、DとAは仮想関数テーブルへのポインタが共通
(単一継承と同様の関係で、DからAへのアップキャストは暗黙に行うこともできる)
だから、仮想関数テーブルへのポインタによる増分は12でなくて8バイト。
残り4バイトは、charより大きいデータ(ポインタ)を含むから、整列の都合上3バイト埋められ、
それでトータル12バイトになる。

160 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 22:26:12.53 ]
でっていう



161 名前:133 mailto:sage [2012/05/13(日) 23:16:40.69 ]
>>155
133で出したクラスは、
9個のクラスを多重継承しており、
うち1つは、2つのクラスを多重継承しています。

完全にノーコストだと思ってたんでやられました。
継承はやめて全部コピペすりゃいいんでしょうけど・・

162 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:33:09.77 ]
組み込みでもやってんじゃないなら気にすんなよ
んなもん今日大したコストじゃねぇぞ
そんな事気にしてたらいつまで経ってもモノができん

163 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:51:21.35 ]
どんだけ多重継承してんだ
継承なんて実際大して使わないと思うんだが
全クラスの2割くらいじゃね

164 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:54:03.40 ]
継承多用も頭悪いヤツが嵌るワナの一種だから仕方が無いのだよ

165 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 00:04:51.01 ]
継承なんてインターフェースの実装用としてしか使わんな
多重継承は使いまくる
実装継承使うときは、デフォルト実装が欲しいときぐらいだな
完全抽象化クラスを継承することがほとんど

つか>>133は何をどういう風に再利用する気なんだろう
再利用するとなると、<algorithm>がいろんなクラスに適用出きるように
普通クラス側でなくクラスを使う側なんだが


166 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 01:14:59.86 ]
>>165
ベクトルです。float32 x 4で16byteな訳です。

多重継承している9種は、
ベクトルとの2項演算子
ベクトルとの単項演算子
ベクトルとの代入演算子
スカラとの2項演算子
スカラとの単項演算子
スカラとの代入演算子
などなど演算子が主です。

再利用化は、他に行列クラスにも使うためです。
合わせて6種類のクラスで使っています。

設計は満足のいくものだったんですが、
16Byteであるべきものが28Byteもあるようでは
はっきり言って使い物になりません。


167 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 04:27:49.77 ]
>>166
こんなのはどう?

#include <iostream>
template<typename Vec, typename Any> struct A : public Any { void a(){}; };
template<typename Vec, typename Any> struct B : public Any { void b(){}; };
template<typename Vec, typename Any> struct C : public Any { void c(){}; };
template<typename> struct Empty {};
struct MyVec : A<MyVec, B<MyVec, C<MyVec, Empty<MyVec> > > > { float x,y,z,w; };
int main() {
std::cout << sizeof(MyVec) << std::endl;
}


168 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 07:37:20.88 ]
継承じゃなくてマクロかincludeで対応するとか

169 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 20:03:33.91 ]
public int FindIndex(Predicate<T> match)
{
}

List<T>と同じ挙動のFindIndexを作りたいんですが、
どう実装されてるのかわかりません
Predicate<T>からメソッドを取り出して、
フィールド変数T[] dataと一致を比較するにはどうしたらいいんでしょうか

170 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 20:10:22.47 ]
誤爆してた、すみません
C#スレで聞いてきます



171 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 04:06:37.89 ]
c丼もスコープ付きusingやtypedef使えれば
便利なんだがなぁ


172 名前:デフォルトの名無しさん [2012/05/17(木) 19:49:25.05 ]
相談室ってこんなに過疎ってたっけ?
・・・というのはさておき、

struct A {
const std::string get(const std::string& value) const {
return value;
}
const bool get(bool value) const {
return value;
}
};


これで
error: conversion from 'bool' to non-scalar type 'std::string {aka std::basic_string<char>}' requested
って怒られるのなんで?
string関係はいつもストレスやわ・・・






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

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

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